npm大家肯定都使用过,对于npm install
很熟悉,安装依赖包的,但是对于npm ci
却陌生,可能会有一些不经常使用的命令,npm ci和npm install都可以用来安装依赖,他们之间有什么区别呢?官方文档
npm ci
和 npm install
类似,不同之处在于npm ci
旨在用于自动化环境,例如测试平台、持续集成和部署,或者您希望确保对依赖项进行全新安装。
npm ci
在以下情况下会明显更快:
有一个 package-lock.json 或 npm-shrinkwrap.json 文件
node_modules 不存在或为空目录
npm install
和 npm ci
的主要区别:
项目必须有 package-lock.json 或 npm-shrinkwrap.json,否则无法使用
npm ci
如果 package-lock.json 中的依赖项与 package.json 中的依赖项不匹配,则
npm ci
将退出并显示错误,而不是更新 package-lock.json。npm ci
一次只能安装整个项目:无法添加单个依赖项。npm ci
开始安装之前自动删除node_modules文件夹。npm ci
不会更改package.json和package-lock.json
由此我们知道,当我们进行CI/CD或生产发布时,最好使用npm ci
,它会严格按照package-lock.json中指定版本进行安装,并且会对比package-lock.json和package.json依赖,防止由错误的依赖版本造成的故障。
总结下主要的区别
npm ci 要求必需有 package-lock.json 或 npm-shrinkwrap.json 文件存在
如果 lock 与 package.json 中版本不匹配,npm ci 直接报错中断,而不是更新 lock 文件
npm ci 不能用来安装单个依赖,只能用来安装整个项目的依赖
npm ci 会检测如果 node_modules 已经存在,则先删除再进行安装操作
npm ci 会安装 dependencies 和 devDependencies,
和 npm install 一样,生产环境下,即通过 -—production 或通过 NODE_ENV 配置,则只会安装 dependencies
不会更新 package.json 或 package-lock.json 文件,整个安装过程是锁死的
缓存 npm ci --cache .npm
npm ci 时建议加上 --quiet --no-progress 关闭进度和其他无用 log,否则产生的日志会很大。
所以 ci 时推荐完整的命令为 npm ci --cache .npm --quiet --no-progress