Gulp изменить рабочий каталог для всей задачи

Я работаю над файлом gulp, который содержит задачи как для интерфейса, так и для бэкэнда моего сайта.
Задача ниже, например, приведет к сжатию моих скриптов в app.js:

gulp.task 'frontend:scripts', ->
    gulp.src frontendPath(scriptsFolder, scriptsPattern)
        .pipe sourcemaps.init()
        .pipe coffee()
        .pipe concat 'app.js'
        .pipe sourcemaps.write('.')
        .pipe gulp.dest frontendPath(tempFolder, scriptsFolder)

Как вы можете видеть, я создал помощника для обеспечения правильного интерфейса:

frontendPath = (dirs...) -> path.join.apply null, ['frontend'].concat(dirs)

Но я должен быть очень осторожным, чтобы все шаги моей задачи (особенно .src и .dest) выполнялись в папке с интерфейсом.

Я знаю, что вы можете использовать параметр { cwd: 'frontend' } для изменения рабочего каталога для .src и .dest. Но есть ли способ изменить весь рабочий каталог для задачи?

Ответ 1

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

gulp.task('frontend', function(){
  process.chdir('...');
  gulp.src(...)
});

gulp.task('backend', function(){
  process.chdir('...');
  gulp.src(...)
});

Убедитесь, что используется последняя версия gulp, эта функция кажется добавлена ​​недавно.

Ответ 2

С тем, как работает gulp, нет смысла "менять каталоги" в шагах между src и dest.

gulp.src считывает файлы с диска в память. Затем .pipe просто передает содержимое этих файлов (и метаданные, связанные с файлами), см. Vinyl file objects для получения дополнительной информации) к другому javascript функции, каждый из которых просто работает с версиями файла в памяти. Это означает, что они не знают о рабочем каталоге или заботятся об одном. Они просто видят, что входящие данные о файлах поступают через канал, делают данные для этих данных и отправляют их через следующий .pipe.

Итак, я думаю, что если вы действительно параноик о том, чтобы быть в родительском директоре, cwd to src и dest - это лучшее, что вы можете сделать.

Все, что можно сказать, вы можете посмотреть shelljs, что позволяет изменять каталоги для текущего процесса node. Я думаю, что это может считаться анти-паттерном, когда дело обходит вокруг, но может стоить выстрела.