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

IT技术 node.js reactjs npm node-modules
2021-04-11 12:47:10

我正在尝试构建一个 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

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

6个回答

第一个可能的解决方案:

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

第二种可能的解决方案:

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

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

第三种可能的解决方案

最坏的情况:

  • nano ~/.bash_aliases 或者 nano ~/.bash_profile
  • 添加 export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
  • CTRL + X 退出
  • Y 保存
必须重申,以上不是解决方案,并且所描述最坏情况在某些情况下是可行的解决方案。
2021-05-24 12:47:10
我想念这个解决方案的原因,如果有它就好了。
2021-06-01 12:47:10
如果您从文件中删除这一行,那么您如何获得对私有仓库的访问权限?
2021-06-15 12:47:10
您可能需要在您的环境中设置 NPM_TOKEN(例如 .zprofile、.bashrc)
2021-06-16 12:47:10
这不是解决方案,而是解决方法。一个合适的解决方案是删除这一行并更新您的 CI 部署配置,如npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" && npm publish.
2021-06-18 12:47:10

其实正确的解决办法

更新您的 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}

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

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

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

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

它在 macOS Catalina 上对我来说效果很好。

我读到推荐的解决方案只是一种“解决方法”,即使是第二推荐的解决方案也是不安全的。我也在 macOS Catalina 上运行,您的解决方案对我来说效果很好。这似乎是最好的解决方案,因为它不会危及安全性,也不是临时解决方法。
2021-06-13 12:47:10
这确实修复了从命令行运行的问题(我也是 macOS Catalina),但是它不适用于各种 CI
2021-06-19 12:47:10

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

source ~/.profile

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