是否可以忽略仅一个模块(或注册表)的依赖哈希验证?
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
命令可能会导致无限循环。
所以更好的方法可能是 运行 grep
、awk
或 sed
命令并获取 yarn.lock
中的包裹条目文件。这将确保 yarn install
命令没有关于散列的信息并且不会发生不匹配
如果你不想使用 awk
、sed
或 grep
因为 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 在任何挂钩 运行.
之前被检查过
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
命令可能会导致无限循环。
所以更好的方法可能是 运行 grep
、awk
或 sed
命令并获取 yarn.lock
中的包裹条目文件。这将确保 yarn install
命令没有关于散列的信息并且不会发生不匹配
如果你不想使用 awk
、sed
或 grep
因为 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 在任何挂钩 运行.