CircleCI 没有缓存我全局安装的节点模块?
CircleCI not caching my globally installed node module?
我正在尝试缓存构建过程所需的命令行工具。该工具由 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 seems to be cached".
如何缓存 starrynight?
好的,我明白了。感谢 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
,但没有意识到姐妹 'directory' bin/starrynight
实际上是模块入口点的基本符号链接。
我的工作假设是 NodeJS 模块 运行 从命令行通过一系列符号引用,可能如下所示。 . .
npm install -g starrynight
创建了两个新工件:
npm
的环境别名名为 starrynight
${prefix}/bin
目录中的符号链接,指向入口点文件,starrynight.js
由 package.json
中的 bin
键指定。
当用户键入 starrynight
作为 CLI 命令时,shell 将其解释为 npm
的别名并执行它。 npm
检查 $0,获取 starrynight
,并使用符号链接 ${prefix}/bin/starrynight
作为要执行的模块启动 nodejs
。该符号链接指向 ~/nvm/v0.10.33/lib/node_modules/starrynight
实际操作发生的位置。
总之,${prefix}/lib/node_modules/xxx
和${prefix}/bin/xxx
都需要缓存
已接受答案中的路径似乎不再有效。我检查了构建实例,现在全局 npm 包在
/opt/circleci/nodejs/<version>
所以我在 circle.yml 中添加了以下内容:
- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"
我正在尝试缓存构建过程所需的命令行工具。该工具由 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 seems to be cached".
如何缓存 starrynight?
好的,我明白了。感谢 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
,但没有意识到姐妹 'directory' bin/starrynight
实际上是模块入口点的基本符号链接。
我的工作假设是 NodeJS 模块 运行 从命令行通过一系列符号引用,可能如下所示。 . .
npm install -g starrynight
创建了两个新工件:
npm
的环境别名名为starrynight
${prefix}/bin
目录中的符号链接,指向入口点文件,starrynight.js
由package.json
中的bin
键指定。
当用户键入 starrynight
作为 CLI 命令时,shell 将其解释为 npm
的别名并执行它。 npm
检查 $0,获取 starrynight
,并使用符号链接 ${prefix}/bin/starrynight
作为要执行的模块启动 nodejs
。该符号链接指向 ~/nvm/v0.10.33/lib/node_modules/starrynight
实际操作发生的位置。
总之,${prefix}/lib/node_modules/xxx
和${prefix}/bin/xxx
都需要缓存
已接受答案中的路径似乎不再有效。我检查了构建实例,现在全局 npm 包在
/opt/circleci/nodejs/<version>
所以我在 circle.yml 中添加了以下内容:
- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"