如何用`yarn`重写嵌套的依赖关系?
如果我的软件包有这些依赖关系
{ "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
安装foobar/node_modules
。
如何强制纱线使用baz@2.0.9
包?
我的理解是,这将是可能的使用npm shrinkwrap
(一个这个问题 )。
我的问题的总结可能是:纱线创build可重复的,确定性的安装,但我如何定制安装?
如果你确实有一个子依赖关系,它会接受什么版本的过度限制,你可以用纱线覆盖它们。 这听起来像是原来的问题不完全正确,但原来的问题实际上是我想回答的问题,我find了答案,所以这里是后代:
我正在使用socket.io库,它具有component-emitter
作为依赖项。 但它有一个它需要的版本。 这是yarn.lock文件在改变之前的样子:
component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" component-emitter@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"
所以在我的客户端代码中包含了两个组件发射器。 我看了看,在1.1.2和1.2.0(或1.2.1,这是当前的)之间似乎没有任何突破性变化。 我第一次尝试只是改变yarn.lock文件:
component-emitter@1.2.1, component-emitter@^1.2.1, component-emitter@1.1.2: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
这工作,但文件有关于它自动生成的警告,这意味着我添加的每一个更新或新的包将踩在这个变化。 有一点search发现了yarn --flat
选项,这将迫使纱线在整个项目中select不超过一个包装。 这对我来说似乎有些过火,因为我确定在旧版和新版软件包之间存在不兼容的实际情况。 我只是想从我的客户代码中删除一个冗余的包,使下载更小; 我仍然希望开发包能够正常工作 。
但是在文档中,我发现了一个可以在package.json中使用的“分辨率”块的引用:
"resolutions": { "package-a": "2.0.0", "package-b": "5.0.0", "package-c": "1.5.2" }
所以我试着在我的package.json的一个新的“分辨率”块中添加"component-emitter" : "1.2.1"
,并且事实上在所有需要它的地方将component-emitter平面化为1.2.1,现在我在我的客户端代码中只有一个副本。
更新编辑:纱线现在,1.0, 正式支持上面的“决议”块。 所以就用那个吧
@SomeCallMeTime的回答非常好,我们一直在做这个工作。
不幸的是, 自v0.24.x以来 , 这是不可能的 (见评论 )。
在Github上有一个公开的PR,提出了一个RFC提案,用一个简单的方法来处理这个用例,而不必关注生成的锁文件。
现在可以使用纱线的select性版本分辨率function 。
在你的项目的package.json
,使用resolutions
:
"resolutions": { "foobar/**/baz": "2.0.9" }
这覆盖了包的foobar
(及其下的任何其他包)版本的baz
,迫使它是2.0.9版本。