我应该将Travis缓存node_modules还是$HOME/.npm?

39

我对于缓存的最佳目录感到相当困惑。我看到过两种方式都被使用和推荐,但并没有实际比较说明为什么要采用其中一种。

例如,Travis博客本身推荐使用

cache:
  directories:
    - node_modules

然而,成千上万的地方使用了这个替代方案:

cache:
  directories:
    - $HOME/.npm

那么为什么要使用其中之一,而不是同时包含两者呢?


请注意,自2019年7月起,Travis CI默认缓存npm。 - Mmmh mmh
2个回答

35

我发现缓存 node_modules 文件夹会导致问题(构建失败),但缓存 .npm 缓存则避免了此问题。我认为这是因为 .npm 缓存不存储编译的本地模块,而 node_modules 文件夹则存储。因此,当您在 Travis-CI 中测试不同版本的 node 时,它将尝试在 node 6 中加载为 node 4 编译的本地模块,并且会出错。


16

跟进@John的回答

为了严格遵循package-lock.json中的包依赖关系,Travis CI上的NPM安装过程现在默认使用新的npm ci(我想ci代表持续集成),而不是npm install。这有助于防止安装未遵循适当语义版本控制的包。

为此,npm ci需要首先摆脱依赖图和node_modules中以前构建的所有缓存编译模块,重新构造依赖图。它通过在开始自己的安装之前完全删除node_modules来实现这一点。但这也意味着在Travis上无法再使用node_modules作为缓存位置。我们现在必须使用"$HOME/.npm"进行缓存,并且@John已经解释了使用"$HOME/.npm"的原因。如果您继续将node_modules用作缓存位置,则Travis会抛出错误, complaining "/node_modules/.bin/npm cannot be found",因为运行npm ci时已删除node_modules

现在关于使用哪个缓存位置...

  1. $HOME/.npm

    当您想要使用现在默认的npm ci时,请在您的.travis.yml中包含这些更改。

# [optional] `npm ci` is now default on Travis
install:
- npm ci

# Keep the npm cache around to speed up installs
cache:
  directories:
  - "$HOME/.npm"
  • node_modules

    如果您希望坚持使用旧的 npm install 命令,请继续使用。

  • # Specify `npm install`
    install:
    - npm install
    
    # Continue to use the old cache location
    cache:
      directories:
      - "node_modules"
    

    警告:您的缓存位置取决于您选择的安装方法,并且不能与其他位置混用。否则,您将有失去缓存优势甚至无法成功构建Travis的风险。

    您可以在NPM文档中了解更多有关npm ci 的信息。


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