Npm 纱线:使用纱线。依赖项锁定

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 我知

我使用Thread直接从公司的GitLab安装软件包:

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文件,而忽略依赖项中存在的锁定文件

    有咖喱