无法使用Bash和NPM替换配置中的env

Mar*_*mas 12 bash heroku node.js npm

我正在尝试在我的应用程序中使用私有NPM模块,并且需要设置适当的NPM访问令牌,以便第三方工具(Heroku和CI)可以访问并安装模块.

我在我的设置中设置了以下行~/.bash_profile:

export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
Run Code Online (Sandbox Code Playgroud)

然后在/path/to/app/.npmrc我有

//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Run Code Online (Sandbox Code Playgroud)

但是,每当我打开终端时,我在启动时都会收到以下错误:

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.
Run Code Online (Sandbox Code Playgroud)

但是,running会echo $NPM_TOKEN返回正确的标记,因此该变量肯定存在.

如果我运行source ~/.bash_profile错误消失,我可以正常安装.

任何帮助,因为我在这个问题上猛烈抨击我的头!

小智 24

对我的修复是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"
Run Code Online (Sandbox Code Playgroud)

export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
export NVM_DIR=~/.nvm
source ~/.nvm/nvm.sh
Run Code Online (Sandbox Code Playgroud)

  • 这太好了,这是我的问题。一旦将我的导出重新排列到我的 nvm.sh 脚本源之上,它就解决了打开终端窗口时的问题。美丽! (2认同)

Jez*_*zor 9

其实正确的解决办法

更新您的 CI 部署配置:

npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"
npm publish
Run Code Online (Sandbox Code Playgroud)

.npmrc文件中删除这一行:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Run Code Online (Sandbox Code Playgroud)

示例构建配置

您可以在我的 GitHub 存储库之一中看到在实践中使用的此解决方案:https : //github.com/Jezorko/lambda-simulator/blob/master/.travis.yml

加密的环境变量是一个 NPM 令牌。

为什么其他“解决方案”只是解决方法

我在这里和这个问题下看到了建议简单地完全删除变量设置行或.npmrc文件的答案。

问题是,.npmrc您的 VCS 系统可能不会忽略该文件,修改它可能会导致意外推送到您的项目存储库。此外,该文件可能包含其他重要设置。

这里的问题是.npmrc在设置环境变量时不允许使用默认值。例如,如果允许以下语法,则问题将不存在:

//registry.npmjs.org/:_authToken=${NPM_TOKEN:-undefined}


小智 -6

在你的情况下你必须这样做rm -f ./.npmrc。这对我有用。

  • 你绝对不想删除你的`.nprmrc` - 这个答案对我有用:/sf/answers/3164020471/ (6认同)
  • .npmrc 文件可以包含 npm 访问 npm 私有存储库所需的信息。所以不要盲目删除.npmrc文件 (2认同)