我必须使用私有注册表中的某些软件包。因此,在我的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一无所知。
我的问题是如何处理?
简短摘要:
我不想将env变量保留在终端配置文件中,而是希望将其放入项目内的.env
文件中。
我必须用{之前 .npmrc
npm install
文件中的env变量
答案 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