所以可以说我在js中有一些代码
const myApiKey = 'id_0001'
但是我不想对其进行编码,而不是将其与其他env vars放在一些bash脚本中,然后从中读取,然后将其替换为JS
因此,假设我会从prod-env.sh
读取产品,或者对于dev我会从dev-env.sh
读取它们,然后gulp或其他工具发挥作用,并根据其中建立的内容替换MY_API_KEY prod-env.sh
或dev-env.sh
。
const myApiKey = MY_API_KEY
更新:我想补充一点,我只关心UNIX操作系统,而不关心Windows。在golang中,有一种方法可以读取例如envVars.get('MY_API_KEY'),我在寻找类似的东西,但在客户端使用JS。
答案 0 :(得分:3)
如果您正在使用gulp,听起来您可以使用任何gulp字符串替换程序,例如gulp-replace。
关于编写gulp任务。如果愿意先将环境导入外壳程序,则在运行节点之前,可以通过process.env
gulp.task('build', function(){
gulp.src(['example.js'])
.pipe(replace('MY_API_KEY', process.env.MY_API_KEY))
.pipe(gulp.dest('build/'));
});
如果您不想在运行节点之前导入环境文件,则可以使用env2之类的库来读取Shell环境文件。
另一种选择是使用js / json定义那些环境文件,并使用require加载它们。
prod-env.js
{
"MY_API_KEY": "api_key"
}
gulpfile.js
const myEnv = require('./prod-env')
gulp.task('build', function(){
gulp.src(['example.js'])
.pipe(replace('MY_API_KEY', myEnv.MY_API_KEY))
.pipe(gulp.dest('build/'));
});
此外,对于更通用的循环替换版本,您可以执行以下操作:
gulp.task('build', function () {
stream = gulp.src(['example.js']);
for (const key in process.env) {
stream.pipe('${' + key + '}', process.env[key]);
}
stream.pipe(gulp.dest('build/'));
});
在最后一个示例中,我在环境变量名称周围添加了${}
,以减少发生事故的可能性。因此,源文件变为:
const myApiKey = ${MY_API_KEY}
答案 1 :(得分:1)
对于不想触摸正在管理的代码的人,此答案是一种简便的方法。例如,您是运维团队的成员,而不是开发团队的成员,则需要按照您的描述进行操作。
环境变量NODE_OPTIONS可以控制有关node.js运行时的许多事情-请参见https://nodejs.org/api/cli.html#cli_node_options_options
我们可以设置的一个这样的选项是--require
,它使我们可以在加载其他任何内容之前运行代码。
因此,您可以使用它创建一个overwrite.js
文件以对所有非node_modules脚本文件执行此替换:
const fs = require('fs');
const original = fs.readFileSync;
// set some custom env variables
// API_KEY_ENV_VAR - the value to set
// API_KEY_TEMPLATE_TOKEN - the token to replace with the value
if (!process.env.API_KEY_TEMPLATE_TOKEN) {
console.error('Please set API_KEY_TEMPLATE_TOKEN');
process.exit(1);
}
if (!process.env.API_KEY_ENV_VAR) {
console.error('Please set API_KEY_ENV_VAR');
process.exit(1);
}
fs.readFileSync = (file, ...args) => {
if (file.includes('node_modules')) {
return original(file, ...args);
}
const fileContents = original(file, ...args).toString(
/* set encoding here, or let it default to utf-8 */
);
return fileContents
.split(process.env.API_KEY_TEMPLATE_TOKEN)
.join(process.env.API_KEY_ENV_VAR);
};
然后将其与以下命令一起使用:
export API_KEY_ENV_VAR=123;
export API_KEY_TEMPLATE_TOKEN=TOKEN;
NODE_OPTIONS="--require ./overwrite.js" node target.js
假设您有一个脚本target.js
console.log('TOKEN');
它将记录为123。您可以在node上将其广泛使用,因此它可以与gulp,grunt或其他任何设备一起正常使用。