我正在使用持续集成并发现了npm ci命令。
我不知道在我的工作流程中使用这个命令有什么好处。
它更快吗?它是否使测试更难,好吗?
从npm 文档:
简而言之,使用 npm install 和 npm ci 的主要区别是:
- 该项目必须具有现有的 package-lock.json 或 npm-shrinkwrap.json。
- 如果包锁中的依赖项与 package.json 中的依赖项不匹配,npm ci 将退出并报错,而不是更新包锁。
- npm ci 一次只能安装整个项目:无法使用此命令添加单个依赖项。
- 如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除。
- 它永远不会写入 package.json 或任何包锁:安装基本上是冻结的。
本质上,
npm install
读取package.json
以创建依赖项列表并用于package-lock.json
通知要安装这些依赖项的哪些版本。如果依赖项不在其中,package-lock.json
它将由npm install
.
npm ci
(以连续集成命名)直接从安装依赖项并仅用于验证没有不匹配的版本。如果缺少任何依赖项或版本不兼容,则会抛出错误。package-lock.json
package.json
用于npm install
添加新的依赖项,以及更新项目的依赖项。npm ci
通常,您会在拉取更新依赖列表的更改之后在开发期间使用它,但在这种情况下使用它可能是一个好主意。
npm ci
如果您需要确定性、可重复的构建,请使用。例如在持续集成、自动化作业等期间以及第一次安装依赖项时,而不是npm install
.
npm install
npm-shrinkwrap.json
and驱动package-lock.json
(按此顺序)。node_modules
.package.json
或package-lock.json
。
npm i packagename
) 一起使用时,它可能会写入package.json
以添加或更新依赖项。npm i
) 如果某些依赖项不在此文件中,它可能会写入以package-lock.json
锁定它们的版本。npm ci
package-lock.json
或npm-shrinkwrap.json
存在。package.json
。node_modules
并安装所有依赖项。package.json
or package-lock.json
。虽然从ornpm ci
生成整个依赖树,但使用以下算法(源)更新内容:package-lock.json
npm-shrinkwrap.json
npm install
node_modules
load the existing node_modules tree from disk clone the tree fetch the package.json and assorted metadata and add it to the clone walk the clone and add any missing dependencies dependencies will be added as close to the top as is possible without breaking any other modules compare the original tree with the cloned tree and make a list of actions to take to convert one to the other execute all of the actions, deepest first kinds of actions are install, update, remove and move
npm ci
将删除任何现有的 node_modules 文件夹并依赖该package-lock.json
文件来安装每个包的特定版本。它比 npm install 快得多,因为它跳过了一些功能。它的干净状态安装非常适合 ci/cd 管道和 docker 构建!您还可以使用它一次安装所有内容,而不是特定软件包。
You should use them in different situations.
npm install
is great for development and in the CI when you want to cache the node_modules
directory.
When to use this? You can do this if you are making a package for other people to use (you do NOT include node_modules
in such a release). Regarding the caching, be careful, if you plan to support different versions of Node.js
remember that node_modules
might have to be reinstalled due to differences between the Node.js
runtime requirements. If you wish to stick to one version, stick to the latest LTS
.
npm ci
should be used when you are to test and release a production application (a final product, not to be used by other packages) since it is important that you have the installation be as deterministic as possible, this install will take longer but will ultimately make your application more reliable (you do include node_modules
in such a release). Stick with LTS
version of Node.js
.
npm i
and npm ci
both utilize the npm cache if it exists, this cache lives normally at ~/.npm
.
Also, npm ci
respects the package-lock.json
file. Unlike npm install
, which rewrites the file and always installs new versions.
Bonus: You could mix them depending on how complex you want to make it. On feature branches in git
you could cache the node_modules
to increase your teams productivity and on the merge request and master branches rely on npm ci
for a deterministic outcome.
您链接的文档有摘要:
简而言之,使用 npm install 和 npm ci 的主要区别是:
- 该项目必须具有现有的 package-lock.json 或 npm-shrinkwrap.json。
- 如果包锁中的依赖项与 package.json 中的依赖项不匹配,npm ci 将退出并报错,而不是更新包锁。
- npm ci 一次只能安装整个项目:无法使用此命令添加单个依赖项。
- 如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除。
- 它永远不会写入 package.json 或任何包锁:安装基本上是冻结的。
这些命令在功能上非常相似,但不同之处在于安装package.json
和package-lock.json
文件中指定的依赖项所采用的方法。
npm ci
执行应用程序的所有依赖项的全新安装,而npm install
如果系统上已经存在某些安装,则可能会跳过它们。package.json
如果系统上已安装的版本不是您要安装的版本,即安装的版本与“必需”版本不同,则可能会出现问题。
其他区别是npm ci
永远不会触及您的package*.json
文件。package.json
如果和package-lock.json
文件中的依赖版本不匹配,它将停止安装并显示错误。
您可以从此处的官方文档中阅读更好的解释。
此外,您可能想在此处阅读有关包锁的信息。
值得记住的是,像 alpine 这样的轻节点 docker 映像没有安装 Python,node-gyp
它是npm ci
.
我认为为了npm ci
正常工作,您需要在构建中安装 Python 作为依赖项,这有点固执己见。
更多信息在这里Docker 和 npm - gyp ERR!不好
它进行全新安装,在删除 node_modules 并重新运行的情况下使用它npm i
。
我不知道为什么有些人认为它是“持续集成”的缩写。有一个npm install
可以运行的命令npm i
和一个可以运行的npm clean-install
命令npm ci
。