package.json
中)任何shacks
都适用于彼此之间不相容的依赖关系(基于.npmrc
文档)。问题是NPM向用户提供了标志,这些标志使他们在设置
npm install
.时可以覆盖此选项。 是有一个NPM命令,该命令将检查同行依赖项实际上很严格(因此我可以推断用户没有使用一个覆盖标志来运行)?Edit以获取额外信息:
我理解的是,用户仍然可以使用以下任何标志运行:
--legacy-peer-deps
,no-strict-peer-deps
--force
改变了安装算法运行的方式,允许彼此使用库的潜在不兼容版本。
如果我要删除package-lock.json文件并运行
npm install
,据我了解,我会遇到错误,因为我没有以前使用过的标志。
我是否还会在重新结帐时出现错误(而不删除package-lock.json文件),我尚未确认。要设定答案的范围,您实际上无能为力,以防止开发人员使用hacks或弄乱自己的项目本地副本。无论您在存储库中包含什么保护措施,在最坏的情况下,开发人员可以编辑其本地副本并更改它们,甚至完全将其删除。 因此,这个答案的范围是双重的。首先,它旨在最大程度地减少这种“黑客”的错误 - 假设是开发人员不是恶意的,但可能并不总是意识到Depecny管理政策背后的所有考虑因素或实施细节,并且可以使用尽可能多的帮助,因为他们可能不会错误地将其弄乱。其次,它的目的是在CI过程中包括安全措施,以确保开发人员制造的任何PR将继续遵守同一政策。
有几个步骤可以(应该)在这里采取(应该)。 如您指出的那样,您应该使用您期望使用的正确依赖项提交您的
package-lock.json
文件,并在项目的
README.md
或CONTRIBUTING.md
中进行文档,该文件应使用而不是
npm ci
使用。如果这些依赖关系是使用非明显或非平凡的标志(例如npm install
.npmrc
。
如果您真的想让开发人员可见,则可以使用使用
npm ci
使用时失败的前安装挂钩,并且只允许npm install
。
钩本身可以很简单:npm ci
定义与将其添加到// preinstall.js
'use strict';
if (process.env.npm_command === 'install') {
console.error("Don't use 'npm install', use 'npm ci' instead");
process.exit(1);
}
:部分的条目一样简单:
scripts
这不是万无一失的,它总是可以通过运行package.json
来解决,但是再次,这里的目的不是要阻止开发人员,而是避免出现粗心的错误。
在CI侧,如评论中提到的Estus烧瓶时,应直接向前 - CI应运行{
"name": "myproject",
"version": "1.0.0",
"scripts": {
"preinstall": "node preinstall.js"
},
"dependencies": {
"some-dependency": "1.2.3"
}
}
(因此使用
npm install --ignore-scripts
中定义的依赖项)和测试,如果安装失败或导致测试失败,则应不应合并PR。
为了额外的审查,大多数协作平台都有一种将审阅者分配给特定文件或目录的方法(例如,代码所有者github或
npm ci
文件(含义依赖关系已更改),需要对某些特定审阅者进行明确责任进行审查,以确保对该文件的任何更改遵守该项目已定义的策略。