使用带有 NODE_ENV=production 的 spawn 函数
Posted
技术标签:
【中文标题】使用带有 NODE_ENV=production 的 spawn 函数【英文标题】:Using spawn function with NODE_ENV=production 【发布时间】:2014-01-16 11:45:09 【问题描述】:我目前正在尝试使用spawn
运行进程。我试图从 shell 运行的是以下内容;
NODE_ENV=production node app/app.js
这是运行它的代码;
var spawn = require('child_process').spawn;
var start = spawn('NODE_ENV=production',['node','app/app.js']);
但是,我收到以下错误;
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:980:11)
at Process.ChildProcess._handle.onexit (child_process.js:771:34)
我怎样才能使用spawn
做到这一点?
【问题讨论】:
【参考方案1】:您的usage of spawn 不正确:
spawn( command, args, options )
:使用给定的命令启动一个新进程,命令行参数在 args 中。如果省略,则 args 默认为空数组。
第三个参数用于指定附加选项,默认为:
cwd: 未定义, env: process.env
使用 env 指定对新进程可见的环境变量,默认为 process.env。
所以环境变量 NODE_ENV
应该在 options 参数中提供:
// ES6 Object spread eases extending process.env
spawn( 'node', ['app.js'], env: ...process.env, NODE_ENV: 'test' )
另见How do I debug "Error: spawn ENOENT" on node.js?
【讨论】:
使用 ES6/7 Stage 3 语法,您可以使用对象扩展语法在一行中完成此操作 -spawn('node', ['app.js'], ...process.env, NODE_ENV: 'test)
【参考方案2】:
语法:spawn(command, [args], [options])
var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], env: NODE_ENV: 'production');
或者保留默认的 ENV 变量:
var spawn = require('child_process').spawn;
var productionEnv = process.env; // TODO should clone process.env like utils.extend
productionEnv.NODE_ENV = 'production';
var start = spawn('node', ['app.js'], env: productionEnv);
我的测试:
app.js
console.log(process.env);
spawn.js
var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], env: NODE_ENV: 'production');
start.stdout.pipe(process.stdout);
从终端:
node spawn
输出:
NODE_ENV: 'production'
【讨论】:
我已经在我的服务器上测试过了,你确定你可以从终端运行node
吗?
我从 iterm 运行,当我使用 console.log(process.env)
时,它会提供 iterm 环境变量。
如果你想使用父进程的环境,不要定义它。【参考方案3】:
这对我有用
var spawn = require('child_process').spawn;
var productionEnv = Object.create(process.env);
productionEnv.NODE_ENV = 'production';
var start = spawn('node', ['app.js'], env: productionEnv);
这没有
var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], env: NODE_ENV: 'production');
【讨论】:
【参考方案4】:添加 shell 选项对我有用
gulp.task('xxx', function (callback)
process.chdir('xxx/');
var spawn = require('child_process').spawn;
var productionEnv = Object.create(process.env);
// var jekyll = spawn('gulp', ['stylecheck'], stdio: 'inherit', env: productionEnv);
var jekyll = spawn('gulp', ['stylecheck'], stdio: 'inherit', env: productionEnv, shell: true);
jekyll.on('exit', function (code)
console.log(arguments);
);
);
【讨论】:
虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。 见nodejs api:nodejs.org/api/… 您只是复制并粘贴了没有很好解释的代码。看起来更好,但请解释一下 这个节点官方文档可能会有所帮助:nodejs.org/api/…以上是关于使用带有 NODE_ENV=production 的 spawn 函数的主要内容,如果未能解决你的问题,请参考以下文章
您当前正在使用 NODE_ENV === "production" 之外的缩小代码
我可以在 webpack 4 中使用 NODE_ENV="staging" 和 mode="production" 吗?
如何在 Windows 上设置 NODE_ENV=production?
您当前正在使用 NODE_ENV === 'production' 之外的缩小代码。这意味着您正在运行一个较慢的 Redux 开发版本