CircleCI 没有缓存我全局安装的节点模块?

CircleCI not caching my globally installed node module?

我正在尝试缓存构建过程所需的命令行工具。该工具由 NodeJS 制成。构建成功,但我需要它 运行 更快。

我的 circle.yml 的相关部分如下所示:

dependencies:    
  post:
    - npm -g list
    - if [ $(npm -g list | grep -c starrynight) -lt 1 ]; then npm install -g starrynight; else echo "StarryNight seems to be cached"; fi

test:
  override:
    - npm -g list
    - starrynight run-tests --framework nightwatch

第二个npm -g list显示starrynight可用,但第一个显示被缓存。

echo $(npm prefix -g)

。 . .得到我。 . .

/home/ubuntu/nvm/v0.10.33

。 . .所以我假设 CircleCI 不会将全局安装的任何内容缓存到 nvm 中。

什么都没有 我试过让我收到消息,"StarryNight seems to be cached".

如何缓存 starrynight

好的,我明白了。感谢 CircleCI 的 Hirokuni Kim 为我指明了正确的方向。

circle.yml 的相关位如下所示:

machine:
  node:
    version: 0.10.33

dependencies:
  cache_directories:
    - ~/nvm/v0.10.33/lib/node_modules/starrynight
    - ~/nvm/v0.10.33/bin/starrynight
  pre:
    - if [ ! -e ~/nvm/v0.10.33/bin/starrynight ]; then npm install -g starrynight; else echo "Starrynight seems to be cached"; fi;

Hirokuni 建议缓存 ~/nvm 但缓存检索花费的时间与构建时间一样长,因为它会恢复 nodejs.

的每个可用版本

我之前曾尝试单独缓存 ~/nvm/v0.10.33/lib/node_modules/starrynight,但没有意识到姐妹 'directory' bin/starrynight 实际上是模块入口点的基本符号链接。

我的工作假设是 NodeJS 模块 运行 从命令行通过一系列符号引用,可能如下所示。 . .

npm install -g starrynight 创建了两个新工件:

  • npm 的环境别名名为 starrynight
  • ${prefix}/bin 目录中的符号链接,指向入口点文件,starrynight.jspackage.json 中的 bin 键指定。

当用户键入 starrynight 作为 CLI 命令时,shell 将其解释为 npm 的别名并执行它。 npm 检查 $0,获取 starrynight,并使用符号链接 ${prefix}/bin/starrynight 作为要执行的模块启动 nodejs。该符号链接指向 ~/nvm/v0.10.33/lib/node_modules/starrynight 实际操作发生的位置。

总之,${prefix}/lib/node_modules/xxx${prefix}/bin/xxx都需要缓存

已接受答案中的路径似乎不再有效。我检查了构建实例,现在全局 npm 包在

/opt/circleci/nodejs/<version>

所以我在 circle.yml 中添加了以下内容:

- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"