Node.js 如何在package.json中使用环境变量
因为我们不希望在项目代码中包含敏感数据,包括package.json文件,所以在我看来,使用环境变量是一个合乎逻辑的选择 示例package.json:Node.js 如何在package.json中使用环境变量,node.js,heroku,npm,package.json,Node.js,Heroku,Npm,Package.json,因为我们不希望在项目代码中包含敏感数据,包括package.json文件,所以在我看来,使用环境变量是一个合乎逻辑的选择 示例package.json: "dependencies": { "accounting": "~0.4.0", "async": "~1.4.2", "my-private-module":"git+https://
"dependencies": {
"accounting": "~0.4.0",
"async": "~1.4.2",
"my-private-module":"git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"
这可能吗
问题不在于这是明智的还是不明智的,而在于如果可能不,这是不可能的,因为npm不将任何字符串值视为任何类型的模板
如果您的提供商支持的话,最好只使用
git+ssh
(如果您的提供商支持的话)。不,这是不可能的。您应该使用git+ssh
访问repo,并在~/.ssh
中存储私钥
然后,您的线路看起来像:
"my-private-module":"git+ssh://git@bitbucket.org/foo/bar.git"
它不包含任何敏感信息。您可以使用环境值在包中注入。json如下所示: 任何以npm_config_开头的环境变量都将被解释为配置参数。例如,在环境中放置npm_config_foo=bar将把foo配置参数设置为bar。任何未指定值的环境配置都将指定值true。配置值不区分大小写,因此NPM\u Config\u FOO=bar也可以使用
我有相似但不同的要求。对我来说,我想在脚本中使用环境变量 我没有直接在package.json中使用环境变量,而是:
"some-script": "./scripts/some-script.sh",
在some-script.sh中:
#!/bin/sh
npm run some-other-script -- --prop=$SOME_ENV_VAR
下面是我如何设法绕过
package.json
来达到同样的目的。它使用一个脚本,从package.json
的自定义部分读取URL模块,在其中插入环境变量,并使用npm install--no save
安装它们(根据使用情况,--no save
可以省略)
作为奖励:它尝试从.env.json
读取env变量,这可以忽略,并且对开发非常有用
package.json的自定义部分读取
env dependencies.js
const execSync = require('child_process').execSync
const pkg = require('./package.json')
if (!pkg.envDependencies) {
return process.exit(0)
}
let env = Object.assign({}, process.env)
if (typeof pkg.envDependencies.localJSON === 'string') {
try {
Object.assign(env, require(pkg.envDependencies.localJSON))
} catch (err) {
console.log(`Could not read or parse pkg.envDependencies.localJSON. Processing with env only.`)
}
}
if (typeof pkg.envDependencies.urls === 'undefined') {
console.log(`pkg.envDependencies.urls not found or empty. Passing.`)
process.exit(0)
}
if (
!Array.isArray(pkg.envDependencies.urls) ||
!(pkg.envDependencies.urls.every(url => typeof url === 'string'))
) {
throw new Error(`pkg.envDependencies.urls should have a signature of String[]`)
}
const parsed = pkg.envDependencies.urls
.map(url => url.replace(/\${([0-9a-zA-Z_]*)}/g, (_, varName) => {
if (typeof env[varName] === 'string') {
return env[varName]
} else {
throw new Error(`Could not read env variable ${varName} in url ${url}`)
}
}))
.join(' ')
try {
execSync('npm install --no-save ' + parsed, { stdio: [0, 1, 2] })
process.exit(0)
} catch (err) {
throw new Error('Could not install pkg.envDependencies. Are you sure the remote URLs all have a package.json?')
}
包.json
中添加一个“postinstall”:“node env dependencies.js”
,这样它将在每次npm安装时运行
package.json
(注意:它们的根目录下都必须有package.json
):#semver:^2.0.0
可以省略,但它引用了一个git标记,这可能非常有用,因为它使您的git服务器成为一个成熟的包管理器)
npm安装
让我们使用grep从.env文件中获取一个值环境变量
"scripts": {
"start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script"
}
非常简单和直接的解决方案
使用“DOTENV”npm包还有其他方法,但当我们试图解决“Github”包依赖性时,它并不能起到多大作用。以上似乎是直截了当的解决方案。此外,您甚至可以为此使用不同的ssh密钥和ssh配置,而不是通常的id_rsa。是的,我建议您这样做。(我的意思是“存储私钥”,但可能更清楚。)谢谢!是的,这是Heroku:-s。我想应该是一个定制的构建包。我认为Docker最终将成为终极环境。需要这样做!当做npmrc能够解释环境变量!但是,我认为,它不能组合,不能用于这些目的…这是用于设置npm脚本使用的变量-类似于package.json中的config部分。package.json无法读取这些变量。请告诉我如何在
其他脚本中访问prop
?已经有一段时间了。你能按照投票率最高的答案来看看这是否有效吗?任何使用docker进行部署的人都不应该使用此选项method@monothorn-有什么更好的方法可以做到这一点?你有什么建议。。。我仍在想,如果我们不使用ssh,还有什么更好的方法。@Ashmah HTTPS是一种方法,但您必须再次限制对生成的令牌的访问,并确保回购是私有的。除此之外,您还必须了解是否还有其他安全问题。这应该是最重要的评论,因为它完美地解决了这个问题。我一直在使用它,但当您开始在多个地方使用它时,它会变得非常冗长。“有没有一个图书馆可以把它缩短?@WritofManamus谷歌it:D这太棒了,谢谢。”。它在“脚本”中工作。不幸的是,它在“配置”中不起作用,这将非常有用。知道为什么吗?纳米-是外壳,不是npm
"scripts": {
"start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script"
}