在 `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完后启动失败报错修复后依然各种失败解决方案