NPM - 无法替换配置中的环境:${NPM_TOKEN}

NPM - Failed to replace env in config: ${NPM_TOKEN}

我正在尝试构建一个 React 应用程序,但是当我执行命令时 npm -i 它给了我以下错误:

Error: Failed to replace env in config: ${NPM_TOKEN}
    at /usr/local/lib/node_modules/npm/lib/config/core.js:415:13
    at String.replace (<anonymous>)
    at envReplace (/usr/local/lib/node_modules/npm/lib/config/core.js:411:12)
    at parseField (/usr/local/lib/node_modules/npm/lib/config/core.js:389:7)
    at /usr/local/lib/node_modules/npm/lib/config/core.js:330:24
    at Array.forEach (<anonymous>)
    at Conf.add (/usr/local/lib/node_modules/npm/lib/config/core.js:328:23)
    at ConfigChain.addString (/usr/local/lib/node_modules/npm/node_modules/config-chain/index.js:244:8)
    at Conf.<anonymous> (/usr/local/lib/node_modules/npm/lib/config/core.js:316:10)
    at /usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:78:16
/usr/local/lib/node_modules/npm/lib/npm.js:61
      throw new Error('npm.load() required')
      ^

Error: npm.load() required
    at Object.get (/usr/local/lib/node_modules/npm/lib/npm.js:61:13)
    at process.errorHandler (/usr/local/lib/node_modules/npm/lib/utils/error-handler.js:205:18)
    at process.emit (events.js:182:13)
    at process._fatalException (internal/bootstrap/node.js:448:27)

我正在使用 MacOS High Sierra。我尝试使用以下命令将 NPM_TOKEN 设置为环境变量:

set -x NPM_TOKEN = xyz

但它不起作用。 有什么问题?

Ubuntu 来自 google 的人:

  • 纳米~/.bash_aliases
  • 出口NPM_TOKEN="PUT_YOUR_TOKEN_HERE"
  • CTRL+X 退出
  • Y 保存

第一个可能的解决方案:

简单解决方案:rm -f ./.npmrc(删除 .npmrc 文件)

第二种可能的解决方案:

不过,如果您不想删除该文件,只需删除 .npmrc 文件中的这行代码即可。

代码行://registry.npmjs.org/:_authToken=${NPM_TOKEN}(删除此代码)

第三种可能的解决方案

最坏情况:

  • nano ~/.bash_aliasesnano ~/.bash_profile
  • 添加export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
  • CTRL + X 退出
  • Y 保存

如果您是第一次设置 ~/.profile (OSX, Ubuntu) 并添加此行:export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"。 然后你必须在终端输入这一行:

source ~/.profile

真正正确的解决方案

更新您的 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 令牌。

为什么其他 "solutions" 只是解决方法

我在这里和 this question 下看到了建议完全删除变量设置行或 .npmrc 文件的答案。

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

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

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

我有一个解决这个问题的简单方法。在您将 NPM_TOKEN 全局设置到您的环境中之后,然后替换

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

//registry.npmjs.org/:_authToken=$NPM_TOKEN

我在 macOS Catalina 上运行良好。

运行 npm install 在 IDE(如 WebStorm)中是我的问题。我将 NPM_TOKEN 环境变量添加到 .bash_profile 并重新启动了我的终端,但不是我的 IDE! IDE 在我也重新启动它之前没有接受对环境的更改。

以下对我有用。我不得不放置

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

在我指定的行之后

export NPM_TOKEN='mytoken'

我的情况是将 .zsh(或 .bash_profile 中的令牌导出移动到文件顶部 解决了问题,因为它之前初始化太晚了。

在我的例子中,我只是将 export NPM_TOKEN 添加到 ~/.bashrc export NPM_TOKEN=60______-69__-44__-be__-2f__________ 这是 bash Ubuntu 20.04

https://www.runoob.com/linux/linux-shell-variable.html 替换

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

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

我也遇到了这个问题,但是当我在 Heroku 上推送我的 repo 时我找到了解决方案,所以我注意到 Heroku 运行 命令 react-script start 或 build

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

所以这个语法没有给出错误,但是当我在我的系统中使用相同的语法和 运行 它给我的命令时。 因为通常当我们 运行 在我们的系统中我们使用 cmd npm 或 yarn 但是如果你使用 react-script 那么它不会给出错误

我在 Gitlab 中尝试设置 CI/CD 作业时遇到了这个问题。我最终发现错误是因为抛出错误的变量被设置为受保护的变量。

我在设置 > CI / CD > 变量下更改了它。

在 Windows 上使用 git bash,设置常规 Windows 环境变量对我有用。这个答案帮助

如果 windowsvisual studio code - 只是 restart 你的 visual studio,很有帮助。

此外,如何在 windows?

上设置此环境变量

打开注册表编辑器,然后按照 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,然后使用您的令牌或您需要的任何内容创建另一个“字符串值”。

对于mac

vim~/.bash_profile

添加export NPM_TOKEN=XXXXX-XXXXX-XXXXX-XXXXX

来源 ~/.bash_profile

此外,在 .zshrc 文件中添加以下条目以在打开新终端 tab/window 时应用配置文件。

if [ -f ~/.bash_profile ]; then
  . ~/.bash_profile
fi

我通过设置 NPM_TOKEN=""

修复了它

在 github 操作中,我设置了 env:

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      NPM_TOKEN: ""
    # ....

使用 AWS CODEARTIFACT

如果您使用 docker,您需要将其添加到您的 Dockerfile

...
ARG CODEARTIFACT_AUTH_TOKEN
...
RUN export CODEARTIFACT_AUTH_TOKEN=$CODEARTIFACT_AUTH_TOKEN
RUN npm i
...

这是 .npmrc 文件

registry=https://sidanmor-codeartifact-main-112233.d.codeartifact.eu-west-1.amazonaws.com/npm/js-utils/
//https://sidanmor-codeartifact-main-112233.d.codeartifact.eu-west-1.amazonaws.com/npm/js-utils/:always-auth=true
//https://sidanmor-codeartifact-main-112233.d.codeartifact.eu-west-1.amazonaws.com/npm/js-utils/:_authToken=${CODEARTIFACT_AUTH_TOKEN}
registry=http://registry.npmjs.org

构建命令将是:

docker build --build-arg CODEARTIFACT_AUTH_TOKEN=xxxyyyzzz . --tag my-tag

您还可以将 ${NPM_TOKEN} 替换为您自己 GitHub 生成的个人令牌