使用带有 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 开发版本

Webpack 使用 NODE_ENV=production 编译 vue 仍然会导致开发警告

if(process.env.NODE_ENV === 'production') 总是假的