CircleCI не кэширует мой глобально установленный модуль node?

Я пытаюсь кэшировать инструмент командной строки, необходимый для моего процесса сборки. Инструмент выполнен из NodeJS. Сборка успешно завершена, но мне нужно, чтобы она работала быстрее.

Соответствующие части моего круга .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 показывает звездную ночь, доступную для использования, но первая показывает, что она не кэшируется.

echo $(npm prefix -g)

., получает меня.,

/home/ubuntu/nvm/v0.10.33

., поэтому я предполагаю, что CircleCI не кэширует ничего, установленное глобально в nvm.

Nothing Я попытался получить мое сообщение: "StarryNight, похоже, кэшируется".

Как я могу кэшировать starrynight?

Ответ 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

Ответ 2

Путь в принятом ответе больше не работает. Я проверил экземпляр сборки, что теперь глобальные пакеты npm находятся в

/opt/circleci/nodejs/<version>

поэтому я добавил в circle.yml следующее:

- "/opt/circleci/nodejs/v4.3.2/lib/node_modules"
- "/opt/circleci/nodejs/v4.3.2/bin"