如何使用 Yarn 基于锁文件安装软件包?

Posted

技术标签:

【中文标题】如何使用 Yarn 基于锁文件安装软件包?【英文标题】:How to install packages based on the lock-file with Yarn? 【发布时间】:2019-03-08 21:11:08 【问题描述】:

我们使用 Yarn 来安装依赖项。 yarn-lock 文件在 repo 中。如果与composer for php相比,我希望当我运行yarn install时,依赖项是基于锁定文件安装的,并且锁定文件不会改变。

使用composer install for php,您可以在任何环境中为每个包安装相同的版本。我不明白为什么纱线不能以类似的方式工作。

我认为yarn install 的锁更新太频繁了,文件失去了意义,因为它实际上并没有锁定版本。还是我使用了错误的命令?

【问题讨论】:

【参考方案1】:

纱线 1

我认为你最好的选择是使用--frozen-lockfile 标志和yarn install

文档:

如果您需要可重现的依赖关系,这通常是持续集成系统的情况,您应该传递 --frozen-lockfile 标志。

还有

如果需要更新,不要生成 yarn.lock 锁定文件并失败。


纱线2

如果使用yarn2(又名纱线berry),则此标志从v2.0.0起重命名为--immutable

来自docs...

如果设置了--immutable 选项(自v3.0.0 以来在CI 上默认为true),如果要修改锁定文件,Yarn 将中止并返回错误退出代码。为了向后兼容,我们提供了一个名为 --frozen-lockfile 的别名,但它将在以后的版本中删除。


这样,如果有人尝试将更改推送到 package.json,例如将 react^16.8.0 升级到 ^16.10.0,而不更新 yarn.lock 文件。然后它将在 CI 中出错,如下所示。

> yarn install --frozen-lockfile
error Your lockfile needs to be updated, but yarn was run with `--frozen-lockfile`.

解决您的评论:

我认为使用 yarn install 时,锁会经常更新,并且文件失去了意义,因为它实际上并没有锁定版本。还是我使用了错误的命令?

Yarn/npm 只是按照你说的去做。如果您将package.json 中的版本设置为"react": "16.8.0",它将永远不会更新yarn.lock,但是当使用npm ranges 中的任何一个时,例如Caret(即"react": "^16.8.0"),yarn/npm 将解析为满足指定范围的最高/最新版本。 拥有所有的力量!


更新

我发现了一个小的边缘案例。如果您在 ci 中运行 yarn add,例如仅用于 ci 依赖项,它将更新锁定文件并安装所有依赖项。比如……

# Add ci dep
yarn add codecov

# Install all deps from yarn.lock
yarn install --frozen-lockfile

这不会像您预期的那样出错。相反,将--frozen-lockfile 添加到这样的纱线添加命令中......

# Add ci dep
yarn add codecov --frozen-lockfile

# Install all deps from yarn.lock
yarn install --frozen-lockfile

【讨论】:

我认为 freeze-lockfile 应该是默认行为的相关 github:github.com/yarnpkg/yarn/issues/4147 还要注意始终使用命令标志,如果你尝试通过.yarnrc设置它,你将永远无法更新yarn.lock:github.com/yarnpkg/yarn/issues/4570 如何更新冻结的锁定文件?【参考方案2】:

查看文档:https://yarnpkg.com/en/docs/cli/install

yarn install 用于从 package.json 安装包和从 yarn.lock 安装。 yarn.lock 文件的存在决定了它是安装操作还是更新操作。

yarn install 安装 package.json 中列出的所有依赖项 在本地 node_modules 文件夹中。

yarn.lock文件的使用如下:

如果存在 yarn.lock 并且足以满足所有依赖项 在 package.json 中列出,yarn.lock 中记录的确切版本是 已安装,并且 yarn.lock 将保持不变。纱线不会检查 较新的版本。如果没有 yarn.lock,或者不足以满足 package.json 中列出的所有依赖项(例如,如果您 手动将依赖项添加到 package.json),Yarn 会查找最新的 满足 package.json 中约束的可用版本。这 结果写入 yarn.lock。

【讨论】:

【参考方案3】:

纱线锁文件希望按照您解释的方式工作 您的 yarn.lock 文件是自动生成的,应该完全由 Yarn 处理。当您使用 Yarn CLI 添加/升级​​/删除依赖项时,它会自动更新您的 yarn.lock 文件。

【讨论】:

好的,但是为什么我的锁文件会在安装时更新,而我没有更改 package.json 文件或没有运行命令来检查可用更新? yarn install 可能会改变 yarn.lock 文件。只有yarn install --frozen-lockfile 才会将lockfile 视为只读文件,如果package.json 和yarn.lock 不同步,则会发生错误。 Yarn 默认行为不强制执行可重现的构建,并且希望它们特别是。在 CI 上。

以上是关于如何使用 Yarn 基于锁文件安装软件包?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Yarn 使用本地路径安装软件包?找不到包

如何在CentOS 7上安装Yarn

yarn 和 npm 在实践中可以互换吗?

Yarn工作区

Yarn工作区

什么是yarn,如何使用yarn安装项目依赖