示例 package.json:
"dependencies": {
"accounting": "~0.4.0",
"async": "~1.4.2",
"my-private-module":"git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"
这可行吗?
问题并不在于这是否明智或者是不好的,而仅在于是否可能。
"dependencies": {
"accounting": "~0.4.0",
"async": "~1.4.2",
"my-private-module":"git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"
这可行吗?
问题并不在于这是否明智或者是不好的,而仅在于是否可能。
如果您使用.env
文件,请使用grep
或eval
从.env文件中获取环境变量的值。
如@Paul建议的,更新了start2
:
"scripts": {
"start": "NODE_ENV=$(grep NODE_ENV .env | cut -d '=' -f2) some_script",
"start2": "eval $(grep '^NODE_ENV' .env) && some_script"
}
eval $(grep '^NODE_ENV' .env) && some_script
。 - Paul$NODE_ENV
就可以了。此外,如果NODE_ENV
已经被定义为环境变量,则不需要重新定义。看起来只是节省您执行 source .env
的时间(您可以使用类似direnv的东西自动为您执行它)。 - Henry Woodyeval $(grep -Ev '(^AWS_PROFILE|^AWS_REGION)' .env)
,这样我就不必这样做了:eval $(grep '^AWS_PROFILE' .env) && eval $(grep '^AWS_REGION' .env)
。 - timhc22eval
来执行文件内容是一个非常糟糕的想法。希望在一些恶意行为者注入他们的.env
文件,比如mysql -e "DROP DATABASE prod;"; NODE_ENV="123"
到你公司的构建流程之前,你能找到新工作。 - joshuakcockrell"some-script": "./scripts/some-script.sh",
而在some-script.sh中:
#!/bin/sh
source .env
npm run some-other-script -- --prop=$SOME_ENV_VAR
'.'不是内部或外部命令,也不是可运行的程序或批处理文件。
- Tomasz Juszczaksource .env
,并且它按预期工作。谢谢。 - Kostanos以下是我如何绕过package.json
来达到相同目的的方法。它使用一个脚本,从package.json
的自定义部分读取URL模块,在其中插入环境变量,并用npm install --no-save
安装它们(根据用例,可以省略--no-save
)。
额外奖励:它尝试从.env.json
中读取环境变量,该文件可以被gitignore,对于开发非常有用。
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?')
}
在你的package.json
文件中添加"postinstall": "node env-dependencies.js"
,这样它将在每次npm install
时运行。
使用你想要的URL将私有git仓库添加到package.json
中(注意:它们都必须在根目录下有一个package.json
文件!):
"envDependencies": {
"localJSON": "./.env.json",
"urls": [
"git+https://${GITHUB_PERSONAL_ACCESS_TOKEN}@github.com/user/repo#semver:^2.0.0"
]
},
semver的规范符号#semver:^2.0.0
可以省略,但它指的是一个Git标签,这非常有用,因为它使得你的Git服务器成为了一个完整的包管理器。
npm install
"my-private-module":"git+ssh://git@bitbucket.org/foo/bar.git"
这里没有包含任何敏感信息。
不可能,因为npm不将任何字符串值视为任何类型的模板。
如果您的提供程序支持,请使用git+ssh
和ssh代理可能更好。
...
SKIP_PREFLIGHT_CHECK=true
...
package.json
...
"scripts": {
"test": "yarn cross-env $(grep SKIP_PREFLIGHT_CHECK ../../.env) react-app-rewired test --watchAll=false"
}
...
https://docs.npmjs.com/misc/config#environment-variables任何以npm_config_开头的环境变量都会被解释为配置参数。例如,将npm_config_foo = bar放在环境中将把foo配置参数设置为bar。没有给定值的任何环境配置都将被赋予true值。配置值不区分大小写,因此NPM_CONFIG_FOO = bar将起作用。
.env
文件中的内容。ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH
Package.json:
"scripts": {
"test": "env-cmd pact-broker can-i-deploy --broker-token=${ENV1}"
}
举个你提出的问题中的另一个例子:
"my-private-module":"env-cmd git+https://${BB_USER}:${BB_PASS}@bitbucket.org/foo/bar.git"
\
来转义$
字符,否则你的终端可能会在传递给env-cmd
之前尝试自动展开它"。他给出了一个npm脚本的例子:env-cmd -x node index.js --arg=\\$VAR
。还可以参考https://github.com/toddbluhm/env-cmd-examples/blob/master/examples/env-file-env-expansion/package.json。 - icc97使用 Docker Compose 注入环境变量
app:
environment:
- NODE_ENV=staging
在Dockerfile中运行你的package.json脚本
CMD [ "npm", "run", "start" ]
使用 echo
或 printenv
"scripts": {
"start": "node -r dotenv/config app.js dotenv_config_path=/run/secrets/$(echo $NODE_ENV)"
"start": "node -r dotenv/config app.js dotenv_config_path=/run/secrets/$(printenv NODE_ENV)"
}
不要将此用于敏感环境变量。这是指向 Docker 机密文件的一种非常好的方式(就像此示例所示)。
对于复杂的环境变量,您可以使用https://stedolan.github.io/jq/来访问JSON文件(在您的情况下是env文件)。 JSON文件可能类似于以下内容:
{
"env" :
{
"username" : "1345345",
"Groups" : [],
"arraytest" : [
{
"yes" : "1",
"no" : "0"
}
]
}
}
所以脚本可能是像这样的,来访问yes值
"scripts": {
"yes": "jq [].arraytest[0].yes?"
}