我发现缓存 node_modules
文件夹会导致问题(构建失败),但缓存 .npm
缓存则避免了此问题。我认为这是因为 .npm
缓存不存储编译的本地模块,而 node_modules
文件夹则存储。因此,当您在 Travis-CI 中测试不同版本的 node
时,它将尝试在 node
6 中加载为 node
4 编译的本地模块,并且会出错。
跟进@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
。
现在关于使用哪个缓存位置...
$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
的信息。