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

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

我的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 ,但是第一个显示它没有被caching。

 echo $(npm prefix -g) 

。 。 。 得到我。 。 。

 /home/ubuntu/nvm/v0.10.33 

。 。 。 所以我假设CircleCI不会caching全局安装到nvm的任何东西。

我试过的东西没有给我留言, “StarryNight似乎被caching了”

我如何cachingstarrynight

好的,我明白了这一点。 感谢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; 

~/nvmbuild议caching~/nvm但caching检索与构build一样长,因为它恢复nodejs所有可用版本。

我以前曾尝试caching~/nvm/v0.10.33/lib/node_modules/starrynight ,但没有意识到姐姐的目录“ bin/starrynight实际上是模块入口点的一个重要符号链接。

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

npm install -g starrynight创build两个新的工件:

  • npm命名为starrynight的环境别名
  • ${prefix}/bin目录中的一个符号链接,它指向入口点文件starrynight.js ,该文件使用package.jsonbin键指定。

当用户starrynight作为CLI命令时,shell会将其解释为npm的别名并执行它。 npm检查$ 0,得到starrynight ,并启动带有symlink ${prefix}/bin/starrynight作为要执行的模块的${prefix}/bin/starrynight 。 这个符号链接指的是真正的动作发生的~/nvm/v0.10.33/lib/node_modules/starrynight

总之,有必要caching${prefix}/lib/node_modules/xxx${prefix}/bin/xxx

被接受的答案中的path似乎不再起作用。 我已经检查了现在全局的npm包所在的构build实例

 /opt/circleci/nodejs/<version> 

所以我已经添加到circle.yml如下:

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