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;
~/nvm
build议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.json
的bin
键指定。
当用户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"