如果我的包有这些依赖
{ "name": "my-package",
"dependencies": { "foobar":"~1.0.3", "baz":"2.0.9" }
foobar
包有这些依赖
{ "name": "foobar",
"dependencies": { "baz":"^2.0.0" }
and the most recently released version of baz
is 2.1.0
, the first run of yarn
will install baz@2.1.0
in foobar/node_modules
。
如何强制纱线使用 baz@2.0.9
包用于 foobar
?
我的理解是,这可以使用 npm shrinkwrap
( 这个问题)。
我的问题的总结可能是:Yarn 创建了可重复的、确定性的安装,但我如何自定义该安装?
原文由 Chris W. 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您确实有一个子依赖项,它在接受哪些版本方面过于严格,您 可以 使用 yarn 覆盖它们。
更新编辑: 从 1.0 开始,Yarn 现在 正式支持“分辨率”块。因此,覆盖分辨率的方法是将这样的块添加到
package.json
:有时您会收到有关“不兼容”版本的警告,但我发现某些软件包(如 socket.io)在他们接受的版本方面 过于 严格,所以我很乐意选择最新版本,因为它实际上并没有破坏事物。
下面的原始但过时的答案。
听起来原来的问题并不完全正确,但原来的问题 实际上 是我想要回答的问题,我找到了答案,所以这里是为了后代:
我正在使用 socket.io 库,它有
component-emitter
作为依赖项。但它有一对它需要的版本。这是在我更改任何内容之前 yarn.lock 文件的样子:所以它在我的客户端代码中包含了组件发射器的两个副本。我看了看,在 1.1.2 和 1.2.0(或当前的 1.2.1)之间似乎没有任何重大变化。我首先尝试更改 yarn.lock 文件:
这行得通,但是该文件有关于它被自动生成的警告,这意味着我添加的每个更新或新包都会踩到这个更改。稍微搜索了一下,找到了
yarn --flat
选项,这将强制 yarn 在整个项目中选择不超过每个包中的一个。这对我来说似乎有点矫枉过正,因为我确信旧包和新包之间存在不兼容的实际情况。我只是想从我的客户端代码中删除一个冗余包,以使下载更小;我仍然希望开发包都能 _正常工作_。但是在 yarn –flat 的文档中,我找到了对可以在 package.json 中的“解决方案”块的引用:
所以我尝试将
"component-emitter" : "1.2.1"
在我的 package.json 中的一个新的“分辨率”块中,实际上它在所有需要它的地方将组件发射器扁平化为 1.2.1,现在我只有一个副本在我的客户代码中。(现在
resolutions
块完全支持yarn
,所以你甚至不需要使用--flat
。)