我正在使用npm在我的项目中安装Node.js依赖项。我想全局缓存Node.js软件包(node_modules
),以便在部署到Heroku时加快管道中的作业。来自GitLab官方docs的示例:
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- .npm/
before_script:
- npm ci --cache .npm --prefer-offline
这是GitLab中的另一个example:
cache:
paths:
- node_modules/
找到了一些使用上述第二种配置的文章(Deploy Node.js App with GitLab CI/CD,Continuous Integration with Node.js, Heroku and GitLab CI/CD -Part 2)。我确实做了一些尝试,并且能够使用这些设置成功将我的应用程序部署到Heroku。但是我不确定缓存机制是否正常工作。
这些配置之间有什么区别?哪种方法最方便地缓存Node.js软件包?
我对gitlab-ci.yml
文件的当前设置:
image: node:latest
cache:
paths:
- node_modules/
stages:
- build
- deploy
build:
stage: build
script:
- npm i
- npm i -g gulp-cli
- gulp build
deploy:
image: ruby:latest
stage: deploy
script:
- apt-get update -qy
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY
only:
- master
不确定我的做法是否正确。
答案 0 :(得分:0)
这取决于您是要使用npm install
(又名npm i
,还是要使用npm ci
。
npm install
将首先查找现有的node_modules
文件夹并重新使用它。如果不是,将获取依赖项。检查full algorithm。
npm ci
会删除现有的node_modules
文件夹以执行依赖关系的全新安装。来自docs:
简而言之,使用
npm install
和npm ci
之间的主要区别是:
- 项目必须具有现有的
package-lock.json
或npm-shrinkwrap.json
。- 如果程序包锁定中的依赖项与package.json中的依赖项不匹配,则
npm ci
将退出并显示错误,而不是更新程序包锁定。npm ci
一次只能安装整个项目:此命令无法添加单个依赖项。- 如果已经存在
node_modules
,它将在npm ci
开始安装之前被自动删除。- 它将永远不会写入
package.json
或任何package-locks
:安装实际上是冻结的。
一些填充了~/.npm
和node_modules
的测试:
$ npm i --prefer-offline
#...
updated 2 packages in 17.472s
$ rm -rf ~/.npm/ # removes global npm cache
$ npm i --prefer-offline
#...
up to date in 16.271s # removing npm cache does not affects to npm i
$ rm -rf node_modules/
$ npm i --prefer-offline
#...
added 2525 packages from 1197 contributors in 55.388s # removing node_modules affetcs to npm i
$ npm ci --prefer-offline
#...
updated 2 packages in 17.201s
$ rm -rf ~/.npm/ # removes global npm cache
$ npm ci --prefer-offline
#...
added 2532 packages in 48.362s # removing npm cache affects to npm ci
$ rm -rf node_modules/
$ npm ci --prefer-offline
#...
added 2532 packages in 18.695s # removing node_modules does not affetcs to npm ci
因此,npm ci
最终具有面向CI的功能,使用这些功能可能很有趣,但是如果对您没有好处,则只需缓存node_modules
并改用npm install
。