如何阻止通过GitHub分支引入的依赖包写入yarn.lock文件?
针对你的需求——始终使用foobar的最新master分支版本,同时不让它被写入yarn.lock,这里有几个可行的方案,根据你使用的Yarn版本来选择:
针对Yarn v1(Classic)
方案1:修改预提交钩子,自动清理lock文件中的该依赖条目
既然你已经在用Git预提交钩子检测,不如把“抛出错误”改成“自动处理”,完全省去手动删除的麻烦。比如在你的pre-commit脚本中添加以下命令:
- Linux/macOS:
# macOS需要加空的-i参数,Linux可省略 sed -i '' '/^foobar/d' yarn.lock git add yarn.lock - Windows:
每次提交前,钩子会自动删除(Get-Content yarn.lock) | Where-Object { $_ -notmatch '^foobar' } | Set-Content yarn.lock git add yarn.lockyarn.lock中foobar的相关条目,再把清理后的lock文件加入暂存区,全程无需手动干预。
方案2:用版本范围标记绕过lock文件固定
你可以在package.json的依赖项后添加语义化版本范围标记,让Yarn把这个Git分支依赖当作“动态更新的范围”,而非固定的commit哈希:
"dependencies": { "foobar": "https://github.com/foo/bar.git#master#semver:>=0.0.0" }
配置后,Yarn不会在yarn.lock中固定foobar的具体commit,每次执行yarn install都会拉取master分支的最新版本。不过这个技巧在部分Yarn v1版本中可能有兼容性问题,建议先在测试环境验证。
针对Yarn v2+(Berry)
Yarn Berry对Git分支依赖的处理更灵活,如果你希望始终拉取最新分支版本,保持原package.json配置即可:
"dependencies": { "foobar": "https://github.com/foo/bar.git#master" }
然后在.yarnrc.yml中添加以下配置:
enableImmutableInstalls: false
这个配置允许Yarn在install时更新Git分支依赖的最新版本,同时不会强制lock文件的不可变性。如果你只想针对foobar生效,可以用选择性resolutions:
resolutions: "foobar": "github:foo/bar#master"
这样Yarn会始终优先使用master分支的最新版本,且不会在lock文件中固定具体的commit哈希。
额外提示
如果你只是希望每次install都拉取最新的foobar版本,其实不一定需要阻止它写入yarn.lock——可以定期执行yarn upgrade foobar --latest,这个命令会自动更新foobar到master分支的最新commit,并同步更新yarn.lock。但如果你的需求是绝对不让它出现在lock文件里,上面的方案更适配。
内容的提问来源于stack exchange,提问作者Calvein

