Использование функции появления с 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);
});
});