Не удалось заменить env в config с помощью Bash & NPM
Я пытаюсь использовать частный модуль NPM в своем приложении и должен установить соответствующие токены доступа NPM, чтобы сторонние инструменты (Heroku и CI) могли получить доступ и установить модуль.
У меня есть следующий набор строк в моем ~/.bash_profile
:
export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
а затем в /path/to/app/.npmrc
у меня есть
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Однако, всякий раз, когда я открываю свой терминал, я получаю следующую ошибку при запуске:
Error: Failed to replace env in config: ${NPM_TOKEN}
at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:429:13
at String.replace (native)
at envReplace (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:424:12)
at parseField (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:400:7)
at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:338:17
at Array.forEach (native)
at Conf.add (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:337:23)
at ConfigChain.addString (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/node_modules/config-chain/index.js:244:8)
at Conf.<anonymous> (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:325:10)
at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:76:16
/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/npm.js:29
throw new Error('npm.load() required')
^
Error: npm.load() required
at Object.npm.config.get (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/npm.js:29:11)
at exit (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/utils/error-handler.js:58:40)
at process.errorHandler (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/utils/error-handler.js:385:3)
at emitOne (events.js:77:13)
at process.emit (events.js:169:7)
at process._fatalException (node.js:221:26)
nvm is not compatible with the npm config "prefix" option: currently set to ""
Run `nvm use --delete-prefix v4.2.1 --silent` to unset it.
Однако запуск echo $NPM_TOKEN
возвращает правильный токен, поэтому переменная определенно существует.
Если я запустил source ~/.bash_profile
, ошибка исчезнет, и я смогу установить ее как обычно.
Любая помощь оценивается, поскольку я пытаюсь сбить голову с этой проблемой!
Ответы
Ответ 1
Исправление для меня было перемещение export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
до моего nvm файла в .bash_profile
от
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh
export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
к
export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh
Ответ 2
В вашем случае вы должны сделать это rm -f ./.npmrc
. Это сработало для меня.
Ответ 3
На самом деле правильное решение
Обновите конфигурацию развертывания CI:
npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"
npm publish
Удалите эту строку из файла .npmrc
:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Пример конфигурации сборки
Вы можете увидеть это решение на практике в одном из моих репозиториев GitHub: https://github.com/Jezorko/lambda-simulator/blob/master/.travis.yml
Переменная зашифрованной среды является токеном NPM.
Почему другие "решения" - просто обходные пути
Я видел ответы здесь и в разделе этого вопроса, в которых рекомендуется просто полностью удалить строку установки переменной или файл .npmrc
.
Дело в том, что файл .npmrc
не может быть проигнорирован вашей системой VCS, и его изменение может привести к случайным добавлениям в ваш репозиторий проекта. Кроме того, файл может содержать другие важные настройки.
Проблема здесь в том, что .npmrc
не позволяет использовать значения по умолчанию при настройке переменных среды. Например, если разрешен следующий синтаксис, проблема будет отсутствовать:
//registry.npmjs.org/:_authToken=${NPM_TOKEN:-undefined}
Ответ 4
Удалите строку ниже из вашего файла "./.npmrc"
//registry.npmjs.org/:_authToken=${NPM_TOKEN}