8

我必须使用私有注册表中的一些包。因此,在我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}无论如何,在这里你可以看到两个 env 变量:${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 一无所知。我的问题是如何处理它?

简短的摘要:

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

  2. 我必须先用 dotenv 替换文件中的env.npmrc变量 npm install

4

1 回答 1

3

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

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

dotenv npm install

或者在我没有文件的情况下.env

dotenv -e .env.local npm install

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

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

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

但是我想如果有人克隆了你的仓库并且他们得到的第一个是失败的npm install‍♂️</p> ,这一定不是最好的开始

另外,检查一下:locking-the-vault-on-font-awesome-npm-tokens

于 2020-01-24T20:46:15.590 回答