流星版本求解器:"meteor update"为什么要降级软件包?



我在一个包里有这个:

  api.use([
    'kestanous:herald@1.1.3',
    'kestanous:herald-email',
  ]);

正如预期的那样,Meteor 使用了 Herald 软件包的 1.1.3 版。

如果我删除@1.1.3版本,包的versions.json不会改变。

但是现在如果我运行meteor update kestanous:herald,这就是我得到的:

$ meteor update kestanous:herald
Changes to your project's package version selections from updating package versions:
kestanous:herald  downgraded from 1.1.3 to 1.0.1

对我来说,升级软件包实际上会降级它没有意义。特别是因为kestanous:herald在应用程序中没有其他任何地方使用。更奇怪的是,尽管有消息,但包的versions.json文件仍然没有更改。

所以似乎要么我不明白包版本控制是如何工作的,要么是某些东西无法正常工作?

我不确定我是否 100% 是正确的,因为所使用的系统非常奇怪,直到最近才更改了很多次。

Meteor的新包系统适用于约束求解器。每个软件包都声明了其设计的 Meteor 版本,例如,如果您为 Meteor 0.9.2 设计了它并在 Meteor 0.1.0 上运行它,那么blaze软件包中会略有不同。

因此,如果您的其他软件包之一所依赖的软件包使用了这个旧版本的 blaze,那么其他软件包将被降级,以便它可以匹配此约束,这样只要约束匹配,就会使用所有包含的软件包的最新版本。

因此,如果herald对某些较旧的 Meteor 包或版本有约束,或者依赖于某些较旧的包,则可能会发生这种情况。

虽然包不必

显式定义,但它也可以从api.versionsFrom("XXX")隐式定义。

然后,Meteor 会相应地升级或降级软件包。

此外,根据

semver 规范,允许的软件包有"回旋余地",次要软件包版本更新是可以的,但主要软件包版本会强制降级,因为新版本被认为不兼容。对此也有一些讨论。

这是 kestanous:herald 的包.js文件:

api.versionsFrom('METEOR@0.9.2');
api.use(['check', 'underscore', 'tracker','accounts-base', 'blaze', 'artwells:queue@0.0.3']);

这意味着 meteor 项目中的所有包都将尝试降级,以便它们都可以与这些其他依赖项兼容。

如果您升级了versionsFrom,那么 meteor 将更容易接受其他软件包中的较新版本。

https://github.com/Meteor-Reaction/Herald/blob/master/package.js#L9

最新更新