11

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

4

2 回答 2

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,它指向入口点文件,用in 中的键starrynight.js指定。binpackage.json

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

简而言之,需要同时缓存${prefix}/lib/node_modules/xxx${prefix}/bin/xxx

于 2015-08-04T12:41:33.720 回答
2

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

/opt/circleci/nodejs/<version>

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

- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"
于 2016-10-21T16:07:38.737 回答