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

pxq42qpu  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(134)

我试图在我的应用程序中使用一个私有的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,错误就消失了,我可以正常安装。
任何帮助感激,因为我在这个问题上把我的头撞到墙上!

nue99wik

nue99wik1#

对我的修复是将export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"移到.bash_profile中我的nvm内容之前

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
cdmah0mi

cdmah0mi2#

真正正确的解决方案

更新配置项部署配置:

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/5882a5d738060c027b830bcc2d58824c5d27942b/.github/workflows/deploy.yml#L26-L27
加密的环境变量是一个NPM标记。

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

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

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

这里的问题是.npmrc在设置环境变量时不允许使用默认值。例如,如果允许使用以下语法,则该问题将不存在:
//registry.npmjs.org/:_authToken=${NPM_TOKEN:-undefined}

gc0ot86w

gc0ot86w3#

适用于Windows 10用户

1.在cmd提示符下运行set NPM_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxx或者将其设置为环境变量

1.编辑.npmrc,应该使用一对%,现在可以运行npm i

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

或(如果以上一项不起作用)

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

顺便说一句,如果您需要备用解决方案:

//registry.npmjs.org/:_authToken=%NPM_TOKEN% //<-- depends on your need
//your-corp-registry-url/:_authToken=%YOUR_CORP_TOKEN% //<-- depends on your need
@your-corp:registry=https://npm.pkg.github.com/path-of-your-corp
registry=https://registry.npmjs.com  //<-- fallback registry
vhmi4jdf

vhmi4jdf4#

我也得到了同样的问题时,写任何命令有关的npm.所以我解决了节点或nodemon.所以当你想启动你的服务器使用节点,当你想安装任何软件包,只要删除这个,然后安装它将工作.

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

我可以在react和node.js中运行react。通过创建自己的server.js文件(如node.js),也可以按节点运行react。这样,我就成功地在Heroku上部署了我的应用程序,并在生产环境中,在您要部署的服务器上给予env变量,在您自己的计算机上,将其放入.bash_profile中,然后放入.gitignore中

export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
ohfgkhjo

ohfgkhjo5#

在你的情况下,你必须这样做rm -f ./.npmrc

相关问题