我正在使用npm在我的项目中安装Node.js依赖项。我想全局缓存Node.js包(node_modules
),以便在部署到Heroku时加速管道中的作业。GitLab官方文档中的一个示例:
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
我不确定我这样做对不对。
2条答案
按热度按时间oxosxuxt1#
这取决于您是要使用
npm install
(又名npm i
)还是要使用npm ci
。npm install
将首先查找现有的node_modules
文件夹并重用该文件夹。如果没有,将提取依赖项。请检查完整算法。npm ci
,而是删除现有的node_modules
文件夹以执行依赖项的全新安装。简而言之,使用
npm install
和npm ci
的主要区别在于:package-lock.json
或npm-shrinkwrap.json
。npm ci
将退出并返回错误,而不是更新包锁。npm ci
一次只能安装整个项目:不能使用此命令添加单个依赖项。node_modules
,则在开始安装npm ci
之前,会自动将其删除。package.json
或任何package-locks
:安装基本上被冻结。某些测试填充了
~/.npm
和node_modules
:第一个
最后,
npm ci
具有面向CI的特性,使用这些特性可能会很有趣,但如果没有任何好处,您只需缓存node_modules
并使用npm install
。s4n0splo2#
无论您选择哪种解决方案,都应该使用
npm ci
而不是npm install
。在GitLab推荐的方法中:
您正在缓存npm安装您的项目(并有效创建node_modules)所需的所有文件。后续作业将运行before_script(
npm ci
)并从缓存中重新生成node_modules。如果缓存存在,这将更快。这种方法的主要优点是灵活性。缓存是 * 真正 * 可选的。如果它不能正确下载或者因为一些TTL而不存在(也许你正在重新运行一个作业),使用
npm ci
的流水线阶段将从互联网上获取所有必要的文件。操作参数是--prefer-offline
您可以使用后一种方法编写一种具有弹性的方法,但它会更加复杂。