Использование функции появления с NODE_ENV = production

В настоящее время я пытаюсь запустить процесс, используя spawn. То, что я пытаюсь запустить из оболочки, следующее:

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

Ваше использование spawn неверно:

spawn( command, args, options ):

Запускает новый процесс с заданной командой с аргументами командной строки в args. Если опущено, args по умолчанию принимает пустой массив.

Третий аргумент используется для указания дополнительных параметров, по умолчанию:

{cwd: undefined, env: process.env}

Используйте env для указания переменных среды, которые будут видимы для нового процесса, по умолчанию используется process.env.

Итак, переменная env NODE_ENV должна быть указана в аргументе options:

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

См. также Как отлаживать "Ошибка: spawn ENOENT" на node.js?

Ответ 2

Синтаксис: spawn (команда, [args], [опции])

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' }

Ответ 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

добавлена ​​опция оболочки для меня

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