【问题标题】:Should I have Travis cache node_modules or $HOME/.npm我应该有 Travis 缓存 node_modules 还是 $HOME/.npm
【发布时间】:2025-12-29 18:05:07
【问题描述】:
我很困惑哪个目录最适合缓存。我见过使用过的和推荐过的,但没有实际比较为什么要选择哪种方式。
例如,Travis blog itself 建议:
cache:
directories:
- node_modules
但是,thousands of places 改用这个:
cache:
directories:
- $HOME/.npm
那么为什么要使用一个而不是另一个,为什么不同时包含两者呢?
【问题讨论】:
标签:
node.js
npm
travis-ci
yarnpkg
【解决方案1】:
关注@John's answer。
为了严格遵守 package-lock.json 的包依赖关系,Travis CI 上的 NPM 安装过程现在默认使用新的 npm ci(我认为ci 代表持续集成)而不是 npm install。这有助于防止安装未遵循正确语义版本控制的软件包。
为此,npm ci 需要首先从以前的构建中删除依赖关系图和 node_modules 中所有缓存的编译模块,以便重新构建依赖关系图。它通过在开始自己的安装之前完全删除node_modules 来做到这一点。但这也意味着node_modules 不能再用作 Travis 上的缓存位置。我们现在必须使用"$HOME/.npm" 进行缓存,@John 已经解释了使用"$HOME/.npm" 的原因。如果您继续使用 node_modules 作为缓存位置,Travis 将向您抛出错误,抱怨 "/node_modules/.bin/npm cannot be found",因为在运行 npm ci 时 node_modules 已被删除。
现在关于使用哪个缓存位置...
-
$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 docs 中找到有关npm ci 的更多信息。
【解决方案2】:
我注意到缓存node_modules 文件夹会导致问题(构建失败),而缓存.npm 缓存避免了它。我相信这是因为.npm 缓存不存储已编译的本机模块,而node_modules 文件夹则存储。因此,当您测试不同版本的 node 时,就像 Travis-CI 中常见的那样,它会尝试加载为 node 4 编译为 node 6 和 barf 的本机模块。