Yarn:是否可以忽略仅一个模块(或注册表)的依赖哈希验证?

时间:2018-03-26 22:38:28

标签: npm yarnpkg

yarn.lock文件保存所有依赖项版本和模块的哈希值。我知道我可以使用选项--skip-integrity-check全局禁用此哈希检查。

我们有一个不断开发的内部模块。依赖性实际上是快照包。更新时,它在我们的持续集成环境中失败,因为更新的包哈希与yarn.lock保存的哈希不同。

是否可以仅针对特定模块禁用完整性检查?

即使它告诉我如何禁用对特定注册表的所有模块的检查,我也会接受答案。

更新:我的问题是,当依赖项更新时,我的持续集成服务器作业正在中断,即使我的代码中没有修改。这些是虚假的失败,我想阻止他们。

更新2:接受的解决方案实际上是解决常规开发工作流程中的问题的方法。有issue open for Yarn in GitHub来解决此问题。

2 个答案:

答案 0 :(得分:7)

而不是运行

yarn install

你应该像下面那样运行

yarn add <specificpackage>@^<versions> --update-checksums
yarn install

这将确保使用该软件包的最新散列更新yarn.lock,然后yarn install将使用完整性检查安装其余软件包

更新-1:4月20日

另一种可能的选择是使用preinstall挂钩。你可以在这里尝试一些东西。您可以尝试更新包。但请注意,在yarn中再次启动preinstall命令会导致无限循环。

更好的方法是运行grepawksed命令并获取yarn.lock文件中的包条目。这将确保yarn install命令没有关于哈希的信息,并且不会发生不匹配

如果由于Windows兼容性而不想使用awksedgrep,那么您应该编写一个简单的nodejs脚本来摆脱{ {1}}文件。这将是跨操作系统兼容的。下面的代码显示了如何做同样的

<强> yarn_remove_hash.js

yarn.lock

您将更新const fs = require('fs') const content = fs.readFileSync("yarn.lock", "utf-8"); const packageToDelete = "yallist" let lines = content.split("\n") for (let [i, line] of Object.entries(lines)) { if (line.startsWith(packageToDelete + "@")) { lines[i]=""; let y = i; while (lines[++y][0] ==" "){ lines[y]= "" } } } fs.writeFileSync("yarn.lock", lines.join("\n")) 中的scripts部分,如下所示

package.json

答案 1 :(得分:0)

如果您想让@Tarun Lalwani 的 --update-checksums 对您和其他人更加透明,您可以将以下内容添加到 .yarnrc

--install.update-checksums true

现在,当用户运行 yarn install 时,它也会隐式更新校验和。这对我来说是必需的,因为我的一个依赖项链接到一个快照 .tar.gz,该快照会发生变化,而 NPM/Yarn 会假设它不会,这显然导致我们遇到了这个完整性问题。由于这个原因,我不得不离开 NPM,还尝试了 preinstall 钩子(我认为我很聪明,但我猜你们也做了同样的事情)。 至少 Yarn 对此有一个选择。 Tarun 的更新答案对我也不起作用,因为在运行任何钩子之前检查了 yarn.lock。