Npm 纱线:使用纱线。依赖项锁定
我使用Thread直接从公司的GitLab安装软件包:Npm 纱线:使用纱线。依赖项锁定,npm,yarnpkg,lockfile,Npm,Yarnpkg,Lockfile,我使用Thread直接从公司的GitLab安装软件包: git+ssh://@: 对于第一级依赖项,我使用warn--pure lockfile根据warn.lock重构我的node\u模块 然而,对于第二级依赖项,Thread似乎总是安装最新版本 因此,假设我依赖于A,这是用特定版本的B测试的。在A的package.json中,我没有指定版本,但它包含在warn.lock中 当我现在安装软件包Awarn时,尽管在A/warn.lock中输入了A/warn.lock,但它将获得最新版本的B 我知
git+ssh://@:
对于第一级依赖项,我使用warn--pure lockfile
根据warn.lock
重构我的node\u模块
然而,对于第二级依赖项,Thread似乎总是安装最新版本
因此,假设我依赖于A
,这是用特定版本的B
测试的。在A的package.json
中,我没有指定版本,但它包含在warn.lock
中
当我现在安装软件包A
warn时,尽管在A/warn.lock中输入了A/warn.lock,但它将获得最新版本的B
我知道我可以通过在a/package.json
中传递特定版本来解决这个问题(至少我认为是这样)
但是,有没有一个选项可以告诉Thread查看依赖项的Thread.lock
?TLDR:
当您在中安装依赖项时
应用程序中,只尊重您自己的纱线.lock文件。锁文件
在您的依赖项中,将忽略
让我们先弄清楚一些事情:
--纯锁文件
与普通纱线安装相同,只是它不会生成纱线。锁文件或更新文件(如果存在)
默认情况下,除非随--无锁文件提供,否则纱线始终从纱线.lock>读取,以在安装时解析依赖项。因此,没有必要告诉它从纱线中读取李>
什么是纱线.锁
用于什么?
warn.lock
用于解析应获取的版本
给定package.json
中模块的semver版本。它不用于确定模块应解析为什么版本。这根本不是它的目的
如纱线文档中所述:为了获得一致性
安装在多台机器上时,纱线需要的信息比
在包json中配置的依赖项。。纱线需要储存
每个依赖项的确切安装版本
要执行此操作,请使用项目根目录中的warn.lock
文件
因此,为了解析依赖项的semver版本
,纱线始终依赖于package.json
。对于给定的semver版本
,纱线检查warn.lock
文件,查看它应该获取什么版本
。这就是为什么纱线(使用npm shrinkwrap.json的npm
使用相同的技术)
例如:^1.2.4
等版本可以解析为=1.2.3和<2.0.0
的任何版本号。如果没有纱线,npm将在一台机器上安装1.2.4
,但在另一台机器上安装1.9.9
,具体取决于安装时的最新版本。这就是使用warn.lock
解决的问题
semver版本
由
package.json
文件。warn.lock
文件只是一个查找
要为给定的semver版本安装的版本和提交哈希
给定semver版本,Thread如何解析模块的版本?
假设当前我们的纱线.lock文件如下所示:
bluebird@2.9.6:
version "2.9.6"
resolved "https://<...>/bluebird-2.9.6.tgz#1fc3a6b1685267dc121b5ec89b32ce069d81ab7d"
bluebird@^2.9.30:
version "2.11.0"
resolved "https://<...>/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
...
myModule@5.1.0:
version "5.1.0"
resolved "https://<...>/moduleA-5.1.0.tgz#ce97130858add59d616ee80675383b0c127290a0"
dependencies:
bluebird "^1.0.0"
从现在开始,每当纱线遇到{bluebird:}
,它都会在锁文件中找到bluebird@
的条目,因此总是将其解析为3.5.0
bluebird@:
version "3.5.0"
resolved "https://<...>/bluebird-3.5.0.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
问题的解决方案
若要解析B:“
到版本说1.0.0
,您需要在纱线中有B@
条目。锁定解析为1.0.0
。一旦,warn.lock
有一个B@
的条目,所有后续安装将始终获取B=”“
的版本1.0.0
以下是实现相同目标所需采取的步骤:
方法1(推荐)
如果希望B解析为最新版本:
在A的package.json中添加B:“
”
运行纱线安装。这将为解析为最新版本的B@
添加一个条目
按warn.lock
文件
从现在开始,无论谁运行纱线安装
都将获得相同的版本
方法2
如果您希望B使用较旧的版本:(强烈不建议使用)
在A的package.json中添加B:1.0.0
李>
运行纱线安装。这将添加一个条目B@1.0.0
在锁文件中
将B@
添加到B@1.0.0
在warn.lock中<代码>B@,B@1.0.0:…
在A的package.json中将B的版本更改为“”
按warn.lock
文件李>
从现在开始,无论谁运行warn install
,都将获得B的版本1.0.0
这种方法是非常危险的,因为你可以轻易地打破一些东西。您的warn.lock文件应始终为
方法3(推荐)
如果你想让B保持在1.0.0
在A的package.json中将B的版本修改为1.0.0
运行纱线安装。这将添加一个条目B@1.0.0
在锁文件中
Push.lock文件
从现在开始,无论谁运行warn install
,都将获得B的版本1.0.0
编辑:使用依赖项中存在的warn.lock文件
如果您选中此项:,他们已经清楚地提到,Thread将只使用顶层的warn.lock文件,而忽略依赖项中存在的锁定文件
有咖喱