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

时间:2015-08-01 22:45:15

标签: node.js caching npm circleci

我正在尝试缓存构建过程所需的命令行工具。该工具由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

2 个答案:

答案 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"