【问题标题】:NPM - Failed to replace env in config: ${NPM_TOKEN}NPM - 无法替换配置中的 env:${NPM_TOKEN}
【发布时间】:2019-01-31 14:25:23
【问题描述】:

我正在尝试构建一个反应应用程序,但是当我执行命令 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

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

【问题讨论】:

标签: node.js reactjs npm node-modules


【解决方案1】:

第一个可能的解决方案:

简单解决方案: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 退出
  • 要保存

【讨论】:

  • 这不是解决方案,而是解决方法。一个适当的解决方案是删除此行并更新您的 CI 部署配置,例如 npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" &amp;&amp; npm publish
  • 我错过了这个解决方案的原因,如果有它会很高兴。
  • 如果您从文件中删除这一行,那么您如何获得对私有仓库的访问权限?
  • 必须重申,上述不是解决方案,而描述的最坏情况在某些情况下是可行的解决方案。
  • 您可能需要在您的环境中设置 NPM_TOKEN(例如 .zprofile、.bashrc)
【解决方案2】:

其实正确的解决方案

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

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

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

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

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

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

【讨论】:

  • 执行npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" 对我来说从标题中抛出了完全相同的错误。仅使用已接受答案中的第一个解决方法解决。
  • 这种方法会将“${NPM_TOKEN}”泄漏给机器上能够列出进程及其参数的任何用户,例如。与pspgrep 等。
  • 添加到 Jenkinsfile 并像魅力一样工作!这正是我想要的!干杯!
  • @Jezor 许多开发人员在多租户内部系统上工作,这些系统位于公司防火墙后面,但内部用户的保护松散。您希望您的安全模型“到处都是松脆的”,而不是“外面是硬壳,里面是软胶”。
  • 这个答案应该放到顶部。
【解决方案3】:

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

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

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

这对我来说在 macOS Catalina 上运行良好。

【讨论】:

  • 这确实修复了从命令行运行的问题(我也是 macOS Catalina),但是它不适用于各种 CI
  • 我读到推荐的解决方案只是一种“解决方法”,甚至第二个最推荐的解决方案也不安全。我也在 macOS Catalina 上运行,您的解决方案对我来说效果很好。这似乎是最好的解决方案,因为它不会损害安全性,也不是临时的解决方法。
  • 解决了我在yarn stackoverflow.com/questions/70659269/… 遇到的一个问题
【解决方案4】:

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

source ~/.profile

【讨论】:

    【解决方案5】:

    在 IDE(如 WebStorm)中运行 npm install 是我的问题。我将 NPM_TOKEN 环境变量添加到 .bash_profile 并重新启动了我的终端,但不是我的 IDE!直到我重新启动 IDE 之后,IDE 才发现对环境的更改。

    【讨论】:

      【解决方案6】:

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

      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'
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

              对于来自谷歌的 Ubuntu 用户:

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

              【讨论】:

                【解决方案11】:

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

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

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

                【讨论】:

                  【解决方案12】:

                  在 Windows 上使用 git bash 时,设置常规 Windows 环境变量对我有用。这个答案帮助了setting an environment variable in Git Bash

                  【讨论】:

                    【解决方案13】:

                    如果是 windowsvisual studio 代码 - 只需重新启动您的 Visual Studio,它会有所帮助。

                    另外,如何在windows上设置这个环境变量

                    打开注册表编辑器,然后关注\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,并使用您的令牌或您需要的任何东西在那里创建另一个“字符串值”。

                    【讨论】:

                      【解决方案14】:

                      Mac 版

                      vim ~/.bash_profile

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

                      来源 ~/.bash_profile

                      另外,在 .zshrc 文件中添加以下条目,以便在打开新的终端选项卡/窗口时应用配置文件。

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

                      【讨论】:

                        【解决方案15】:

                        我通过设置NPM_TOKEN=""修复了它

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

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

                        【讨论】:

                          【解决方案16】:

                          使用 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
                          

                          【讨论】:

                            【解决方案17】:

                            就我而言,我只是将 export NPM_TOKEN 添加到 ~/.bashrc export NPM_TOKEN=60______-69__-44__-be__-2f______ 这是针对 bash Ubuntu 20.04

                            【讨论】:

                              猜你喜欢
                              • 2019-05-18
                              • 1970-01-01
                              • 2022-11-03
                              • 2014-08-02
                              • 2021-03-21
                              • 2014-03-23
                              • 2019-09-12
                              • 2014-04-04
                              • 2020-10-19
                              相关资源
                              最近更新 更多