Выполнить команду в gulp для подпапки

Мой проект структурирован следующим образом:

myapp
 -server.js
 -test
 --testcontent
 ---package.json
 -package.json

У меня есть два файла package.json, и я хочу запустить npm install на package.json внутри папки testcontent.

Если в командной строке я перехожу к myapp/test/testcontent и запускаю npm install, он работает и создает новую папку node_modules с зависимостями от правильного package.json. Как это можно сделать изнутри gulp?

Я попробовал следующее, но он использует package.json в myapp, а не в подпапке testcontent:

gulp.task('default', function () {
    var options = {
        continueOnError: true, // default = false, true means don't emit error event
        pipeStdout: true, // default = false, true means stdout is written to file.contents
        customTemplatingThing: "test" // content passed to gutil.template()
    };
    var reportOptions = {
        err: true, // default = true, false means don't write err
        stderr: true, // default = true, false means don't write stderr
        stdout: true // default = true, false means don't write stdout
    }
    gulp.src('test/testcontent/')
        .pipe(exec('npm install' , options))
        .pipe(exec.reporter(reportOptions));
});

person Community    schedule 24.07.2016    source источник


Ответы (1)


gulp-exec не подходит для этой работы. На самом деле авторы плагина gulp-exec явно советуют использовать его так, как вы:

Примечание. Если вы просто хотите запустить команду, просто запустите команду, не используйте этот плагин.

Вместо этого вы используете встроенный в node.js child_process.spawn(). Вы можете передать каталог, в котором должна выполняться команда, используя опцию cwd:

var spawn = require('child_process').spawn;

gulp.task('default', function(done) {
  spawn('npm', ['install'], { cwd: 'test/testcontent/', stdio: 'inherit' })
    .on('close', done);
});
person Sven Schoenung    schedule 24.07.2016
comment
Спасибо, так как же мне передать это другому процессу? Скажем, я хочу передать это так: return gulp .src(config.alljs) .pipe($.if(args.verbose, $.print())) - person ; 24.07.2016
comment
Что вы имеете в виду, передать это другому процессу? Вы хотите отправить стандартный вывод установки npm другому процессу? Что именно вы хотите сделать? - person Sven Schoenung; 24.07.2016
comment
Ваш пример не имеет смысла. Какое отношение печать имен файлов имеет к выполнению установки npm? Эти двое никак не связаны. - person Sven Schoenung; 24.07.2016
comment
Например, если вы хотите выполнить установку npm, а также скопировать файлы и т. д., как бы вы это сделали? - person ; 24.07.2016
comment
Вы пишете одну задачу для копирования файлов и одну задачу для выполнения установки npm. Затем вы выполняете обе эти задачи. Поскольку обе операции не имеют абсолютно ничего общего, они должны быть в отдельных задачах. - person Sven Schoenung; 24.07.2016
comment
но если, например, я хочу, чтобы он запускался с помощью ‹b›default‹/b› spawn & copy & run mochaTest, как бы вы это сделали? не могли бы вы привести пример? - person ; 24.07.2016
comment
Нет, не в этом посте. Я ответил на ваш первоначальный вопрос. Вы сейчас задаете совсем другой вопрос. Сделайте для этого новый пост. - person Sven Schoenung; 24.07.2016