Ответ 1
Хорошо, я понял это. Спасибо Хирокуни Ким из CircleCI за то, что он указал мне в правильном направлении.
Соответствующие биты нового 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, оболочка интерпретирует его как псевдоним для npm
и выполняет его. npm
проверяет $0, получает starrynight
и запускает nodejs
с символической ссылкой ${prefix}/bin/starrynight
в качестве исполняемого модуля. Эта символическая ссылка относится к ~/nvm/v0.10.33/lib/node_modules/starrynight
, где происходит реальное действие.
Короче говоря, необходимо кэшировать как ${prefix}/lib/node_modules/xxx
, так и ${prefix}/bin/xxx