我在一个包里有这个:
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