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

Is it possible to ignore the dependency hash validation of just one module (or registry)?

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

选项全局禁用此哈希检查

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

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

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

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

更新 2: 公认的解决方案实际上是解决通常开发工作流程中问题的 hack。有一个 issue open for Yarn in GitHub 来解决这个问题。

代替运行宁

yarn install

你应该运行像下面这样

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

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

更新 1:4 月 20 日

另一个 possible 选项是使用 preinstall 钩子。您可以在这里尝试一些事情。您可以尝试更新软件包。但请注意,在 preinstall 中再次启动 yarn 命令可能会导致无限循环。

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

如果你不想使用 awksedgrep 因为 windows 兼容性那么你应该只写一个简单的 nodejs 脚本来摆脱yarn.lock 文件中的包。这将与 cross-os 兼容。下面的代码显示了如何做同样的事情

yarn_remove_hash.js

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"))

您将更新 package.json 中的 scripts 部分,如下所示

...
"preinstall": "node yarn_remove_hash.js"
...

如果你想让@Tarun Lalwani 的 --update-checksums 对你和其他人来说更像是一个 t运行sparent 过程,你可以将以下内容添加到 .yarnrc:

--install.update-checksums true

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

之前被检查过