node.js 在 NODE_ENV=production 中使用 spawn 函数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20825157/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 16:34:36  来源:igfitidea点击:

Using spawn function with NODE_ENV=production

node.js

提问by aacanakin

I'm currently trying to run process using spawn. What I am trying to run from shell is the following;

我目前正在尝试使用spawn. 我试图从 shell 运行的是以下内容;

NODE_ENV=production node app/app.js

NODE_ENV=production node app/app.js

Here's the code to run that;

这是运行它的代码;

var spawn = require('child_process').spawn;
var start = spawn('NODE_ENV=production',['node','app/app.js']);

However, I got the following error;

但是,我收到以下错误;

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)

How can I do that using spawn?

我怎样才能做到这一点spawn

回答by laconbass

Your usage of spawnis not correct:

对 spawn 的使用不正确

spawn( command, args, options ):

Launches a new process with the given command, with command line arguments in args. If omitted, args defaults to an empty Array.

The third argument is used to specify additional options, which defaults to:

{ cwd: undefined, env: process.env }

Use env to specify environment variables that will be visible to the new process, the default is process.env.

spawn( command, args, options )

使用给定的命令启动一个新进程,在 args 中带有命令行参数。如果省略,args 默认为空数组。

第三个参数用于指定附加选项,默认为:

{ cwd:未定义,环境:process.env }

使用 env 指定对新进程可见的环境变量,默认为 process.env。

So the env variable NODE_ENVshould be provided on the options argument:

因此NODE_ENV应在 options 参数上提供env 变量

// clone the actual env vars to avoid overrides
var env = Object.create( process.env );
env.NODE_ENV = 'test';
spawn( 'node', ['app.js'], { env: env } );

See also How do I debug "Error: spawn ENOENT" on node.js?

另请参阅如何在 node.js 上调试“错误:生成 ENOENT”?

回答by damphat

Syntax: spawn(command, [args], [options])

语法:spawn(command, [args], [options])

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

Or keep default ENV variables:

或者保留默认的 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});


My test:

我的测试:

app.js

应用程序.js

console.log(process.env);

spawn.js

生成.js

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

start.stdout.pipe(process.stdout);

from terminal:

从终端:

node spawn

output:

输出:

{ NODE_ENV: 'production' }

回答by John Papa

This worked for me

这对我有用

var spawn = require('child_process').spawn;
var productionEnv = Object.create(process.env);
productionEnv.NODE_ENV = 'production';
var start = spawn('node', ['app.js'], {env: productionEnv});

this did not

这没有

var spawn = require('child_process').spawn;
var start = spawn('node', ['app.js'], {env: {NODE_ENV: 'production'}});

回答by Augustine

add shell option worked for me

添加外壳选项对我有用

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);
    });
});