在 `npm install` 之前用 dotenv 替换 .npmrc 中的 env 变量

Posted

技术标签:

【中文标题】在 `npm install` 之前用 dotenv 替换 .npmrc 中的 env 变量【英文标题】:Replace env variables in the .npmrc with dotenv before `npm install` 【发布时间】:2019-09-12 00:58:05 【问题描述】:

我必须使用私有注册表中的一些包。所以,在我的 package.json 在依赖部分我有这样一行:

...
"dependencies": 
    "@myco/my-awesome-package": "^0.4.5",
    ...

...

私有注册表需要认证,所以我必须在我的项目中创建.npmrc文件:

registry=https://registry.npmjs.org/
@myco:registry=https://myco-registry-path/
//myco-registry-path/:username=$MYCO_REGISTRY_USER
//myco-registry-path/:_password=$MYCO_REGISTRY_PASSWORD_BASE64

是的,我知道_authToken,但在我的情况下,使用用户名和密码更容易。

无论如何,在这里您可以看到两个环境变量:$MYCO_REGISTRY_USER$MYCO_REGISTRY_PASSWORD_BASE64,我必须替换 之前 npm install。 我知道这个问题的非常简单的解决方案:将它们放入“全局”环境变量中,例如放入我的 .bash_profile (或您选择的任何终端配置文件)。 但我不想将这样的变量保留在“全局”范围内,因为它们仅对当前项目很重要。我想做的是使用dotenv。我想在我的项目的根目录中创建一个.env 文件:

MYCO_REGISTRY_USER=myco-registry-username-value
MYCO_REGISTRY_PASSWORD_BASE64=myco-registry-password-value-base64

我希望这个值替换我的 .npmrc 在安装操作中的环境变量。但是当我尝试npm install 时,我得到一个错误:Error: Failed to replace env in config: $MYCO_REGISTRY_USER。我能理解为什么会这样。可能是因为 npm 首先读取 .npmrc 值并尝试替换 env 变量并失败,因为此时它对 dotenv 一无所知。 我的问题是如何处理?

简短的总结:

    我不想将 env 变量保留在终端配置文件中,而是想将其放在我的项目中的 .env 文件中。

    我必须用 dotenv before npm install

    替换 .npmrc 文件中的 env 变量

【问题讨论】:

您应该运行脚本,该脚本可以从 .npmrc 复制配置变量并创建 .env。 【参考方案1】:

我知道这个答案可能来得太晚了,但如果其他人正在寻找答案,这里有一个解决方案:

您需要在脚本前添加dotenv-cli,如下所示:

dotenv npm install

或者在我的情况下文件不是.env

dotenv -e .env.local npm install

问题是您无法将其保存在任何地方,以便有人可以通过“npm install”以某种方式使用它。绝对npm preinstall 在读取.npmrc 之后运行,所以它也失败了。

你需要把它记录好,或者只包含一个小的 shell 脚本,但如果你支持不同的操作系统,那么它会很快变得有趣......

令人高兴的是,像 Netlify 这样的 CD 平台允许您手动设置环境变量。

但我想这一定不是最好的开始,如果有人克隆你的 repo,而他们首先得到的是失败的npm install?‍♂️

另外,看看这个:locking-the-vault-on-font-awesome-npm-tokens

【讨论】:

以上是关于在 `npm install` 之前用 dotenv 替换 .npmrc 中的 env 变量的主要内容,如果未能解决你的问题,请参考以下文章

强制在纱线之前运行 npm install ?

npm install完后启动失败报错修复后依然各种失败解决方案

npm install

ionic3 npm install cordova error syscall rename

npm install (让别人下载自己的包)

如何使用带有 webpack 的 npm install 来使用 normalize.css?