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

时间:2019-04-22 21:00:57

标签: node.js npm npm-install dotenv

我必须使用私有注册表中的某些软件包。因此,在我的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有所了解,但就我而言,更容易使用用户名和密码。

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

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

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

简短摘要:

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

  2. 我必须用{之前 .npmrc

  3. 替换dotenv npm install文件中的env变量

1 个答案:

答案 0 :(得分:1)

我知道这个答案可能来不及,但是如果其他任何人都在寻找答案,这是一个解决方案:

您需要在脚本前加上dotenv-cli

dotenv npm install

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

dotenv -e .env.local npm install

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

您将需要对其进行很好的记录或仅包含一个小的Shell脚本,但是如果您支持不同的操作系统,那么它很快就会变得有趣起来...

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

但是我想,如果有人克隆了您的存储库,而他们首先遇到的却是失败的npm install ♂‍♂️

,这可能不是最好的开始

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