有没有一种方法让 "npm ci" 安装 devDependencies,或者让 "npm install" 不更新 package-lock.json?

78

我正在为新开发人员编写文档,帮助他们在本地开发环境中安装我们的代码库。我想给他们以下命令:

  • 根据package-lock.json中的版本安装devDependencies和dependencies
  • 不更新package-lock.json

"npm ci" 几乎完全符合我的要求,但似乎没有安装devDependencies。"npm install"可以安装devDependencies,但有时会修改package-lock.json。

我可以想象一些奇怪的方式,比如 "npm install && git checkout package-lock.json",但我觉得应该有一种更常见的说法,表示“为这个项目的开发提供一个干净的依赖项安装?”

2个回答

110

npm ci 命令会同时安装生产环境和开发环境所需的依赖包。但是如果你使用 npm ci --production 或者设置了 NODE_ENV 环境变量为 production,那么它会避免安装开发环境所需的依赖包。请参考文档

使用 --production 标志(或将 NODE_ENV 环境变量设置为 production),npm 将不会安装在 devDependencies 中列出的模块。

注意:向项目添加依赖项时,--production 标志没有特定的含义。


2
那么,你如何进行 npm install,然后进行 npm test,最后移除 devdependencies 呢?如果你使用 npm install --only=production,那么就无法运行测试。 - Marc
7
请执行以下步骤:使用命令 npm install --no-save 或者 npm ci 进行安装,然后运行 npm test 进行测试,最后使用命令 npm prune --production 进行优化。 - alice kibin
26
您所提供的链接是有关npm install命令的,而npm ci页面并没有列出任何命令行标志。npm ci是否支持与npm install相同的命令行标志?如果是这样,我希望文档中能明确指出。否则,人们可能会在命令中添加无效的选项,而文档中却有很多“使用此标志”的答案。如果我运行npm install --foobar命令,npm不会警告或抱怨该选项是无效的。因此,很可能有很多人正在使用不起作用的命令行选项。 - mattpr
14
为了未来的读者,只是为了澄清@mattpr的评论,“npm ci --production”确实起到了预期的作用(我已经测试过了)。也许可以提交一个PR更新“npm ci”的文档。 - Leponzo
8
以后请使用 --omit=dev 而不是 --production。 - Ε Г И І И О
我有同样的问题,npm版本是8.19.4。运行npm ci --omit=dev命令时,会修改我不需要的package-lock。我的想法是在git下有一个package-lock,并且在服务器和开发者端执行两个命令(npm ci用于开发环境,npm ci --omit=dev用于生产环境)。有人有什么想法吗? - undefined

72

覆盖 NODE_ENV 变量

当您的 NODE_ENV 环境变量设置为 production 时,使用 npm ci 将不会安装 devDependencies。但如果您仍想安装 devDependencies

npm ci --include=dev

这将解决问题 ;)


对于NPM v7.x以前的版本,请使用

npm ci --also=dev

5
从v7版本开始,“also”选项已被弃用。请改用“--include=dev”。https://docs.npmjs.com/cli/v7/using-npm/config#also - n370

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接