我正在尝试缓存构建过程所需的命令行工具。该工具由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好像是高速缓存" 。
如何缓存 starrynight ?
答案 0 :(得分:6)
好的,我想出来了。感谢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
,而没有意识到姐妹'目录'bin/starrynight
实际上是模块入口点的基本符号链接。
我的工作假设是NodeJS模块通过一系列符号引用从命令行运行,可能如下所示。 。 。
npm install -g starrynight
会创建两个新工件:
npm
starrynight
的环境别名
${prefix}/bin
目录中的符号链接,指向starrynight.js
中使用bin
键指定的入口点文件package.json
。当用户键入starrynight
作为CLI命令时,shell会将其解释为npm
的别名并执行它。 npm
检查$ 0,获取starrynight
,并使用符号链接nodejs
作为要执行的模块启动${prefix}/bin/starrynight
。该符号链接指的是发生实际操作的~/nvm/v0.10.33/lib/node_modules/starrynight
。
简而言之,有必要同时缓存${prefix}/lib/node_modules/xxx
和${prefix}/bin/xxx
答案 1 :(得分:2)
接受的答案中的路径似乎不再起作用了。我已经检查了现在全局npm包在
中的构建实例/opt/circleci/nodejs/<version>
所以我在circle.yml中添加了以下内容:
- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"