如果我的包有这些依赖项
{ "name": "my-package",
"dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }
foobar
包具有以下依赖项
{ "name": "foobar",
"dependencies": { "baz":"^2.0.0" }
最新发布的baz
版本是2.1.0
,第一次运行yarn
将在foobar/node_modules
中安装baz@2.1.0
。
如何强制yarn将baz@2.0.9
包用于foobar
?
我的理解是,这将是可能的使用npm shrinkwrap
(一个la this question)。
我的问题的总结可能是:Yarn创建了可重复的、确定性的安装,但我如何定制该安装呢?
3条答案
按热度按时间bihw5rsg1#
如果你确实有一个子依赖项,它在接受什么版本上有过度的限制,你可以使用yarn覆盖它们。
**更新编辑:**Yarn now,as of 1.0,officially supports“resolutions”块。因此,覆盖分辨率的方法是向
package.json
添加这样的块:您有时会收到“不兼容”版本的警告,但我发现有些软件包(如 www.example.com )在他们接受的版本上过于严格,所以我很乐意选择最新版本,因为它实际上不会破坏东西。
下面是原始但过时的答案。
听起来原来的问题并不完全正确,但原来的问题实际上是我想要回答的问题,我找到了答案,所以在这里给后代:
我用的是 www.example.com 。但它需要两个版本。这是什么Yarn。锁文件看起来像我改变任何东西之前:
所以它在我的客户端代码中包含了组件发射器的两个副本。我看了看,在1之间似乎没有任何中断的变化。1.2和1.2。0(或1.2.1,这是当前版本)。我第一次尝试只是改变Yarn。锁定文件:
这是可行的,但是文件有关于它被自动生成的警告,这意味着我添加的每一个更新或新包都会踩在这个更改上。稍微搜索一下就发现了
yarn --flat
选项,它将强制yarn在整个项目中选择不超过一个包。这对我来说似乎有些矫枉过正,因为我确信新旧包之间确实存在不兼容的情况。我只是想从我的客户端代码中删除一个冗余的包,以使下载量更小;我仍然希望开发包都能正确地工作。但是在yarn--flat的文档中,我发现了一个可以放在包中的“resolutions”块的引用。json:
因此,我尝试将
"component-emitter" : "1.2.1"
放在软件包中一个新的“resolutions”块中。JSON,它实际上将component-emitter展平为1。2.1为所有需要它的地方,现在我只有一个副本在我的客户端代码。(And现在
yarn
完全支持resolutions
块,所以你甚至不需要使用--flat
。)c3frrgcw2#
现在可以使用yarn的selective version resolution feature。
在项目的 main(root)
package.json
中,使用resolutions
:这将覆盖
foobar
包(以及它下面的任何其他包)的baz
版本,强制它成为版本2。0.9.w1e3prcc3#
编辑:现在不推荐使用,请阅读以下答案:
https://stackoverflow.com/a/46615878/2398593
@SomeCallMeTime的answer很棒,我们已经在工作中这样做了几个月了。
不幸的是,这是不可能的,因为v0。24.x(见该评论)。
有一个开放的PR on Github,其中有一个RFC提议,它有一个简单的方法来处理用例,而不必关注生成的锁文件。