gulp.run устарел. Как мне составлять задачи?


97

Вот составная задача, которую я не знаю, как заменить ее зависимостями задач.

...
gulp.task('watch', function () {
 var server = function(){
  gulp.run('jasmine');
  gulp.run('embed');
 };
 var client = function(){
  gulp.run('scripts');
  gulp.run('styles');
  gulp.run('copy');
  gulp.run('lint');
 };
 gulp.watch('app/*.js', server);
 gulp.watch('spec/nodejs/*.js', server);
 gulp.watch('app/backend/*.js', server);
 gulp.watch('src/admin/*.js', client);
 gulp.watch('src/admin/*.css', client);
 gulp.watch('src/geojson-index.json', function(){
  gulp.run('copygeojson');
 });
});

Соответствующий журнал изменений https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#35 [исключить gulp.run]

Ответы:


82
gulp.task('watch', function () {
  var server = ['jasmine', 'embed'];
  var client = ['scripts', 'styles', 'copy', 'lint'];
  gulp.watch('app/*.js', server);
  gulp.watch('spec/nodejs/*.js', server);
  gulp.watch('app/backend/*.js', server);
  gulp.watch('src/admin/*.js', client);
  gulp.watch('src/admin/*.css', client);
  gulp.watch('src/geojson-index.json', ['copygeojson']);
});

Вам больше не нужно передавать функцию (хотя вы все еще можете) для запуска задач. Вы можете дать часам массив имен задач, и он сделает это за вас.


13
Что, если я хочу выполнить какое-то задание, прежде чем я начну смотреть? Например, я хочу посмотреть scripts, но также имеет смысл принудительно запустить эту задачу сразу (не дожидаясь изменения файла сценария).
Monsignor

4
И есть ли способ передать аргументы этим задачам?
Доктор Эрни

7
@rachel не имеет отношения к вопросу, который задал Монсингор.
Марк Эмери

6
@Monsingor Для этого вы можете определить новую задачу, которая выполняет список задач. Например, я обычно определяю следующую задачу по умолчанию gulp.task('default', ['build', 'watch']);, которая сначала создает, а затем начинает просмотр.
Бастиан ван ден Берг,

1
@BastiaanvandenBerg Я думал, что задачи gulp предназначены для параллельной работы? Таким образом, даже если вы сначала указываете сборку, она не должна завершаться до запуска задачи наблюдения. Я получаю от OP, что они хотят убедиться, что сборка завершена до начала просмотра.
Шон Райан,

85

Или можно сделать так:

gulp.start('task1', 'task2');

3
Это безопасно использовать? Я не вижу, чтобы это упоминалось в документации API (ссылка) .
Felix Rabe

4
.startявляется методом Orchestrator. Поскольку Gulp наследует от этого, он должен работать. Я запускаю задачу gulp из функции без gulp (watchify), и, похоже, это работает.
joemaller

24
gulp.startбудет удален в следующем выпуске: github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart

13
@yckart так что мы используем для выполнения задачи?
chovy 08

6
Пересматривая это, большинство случаев использования gulp-startможно заменить на run-sequence npmjs.com/package/run-sequence
joemaller

25

источник: https://github.com/gulpjs/gulp/issues/755

gulp.start()никогда не предназначался для использования в качестве общедоступного API. И, как указано выше в комментариях, в следующем выпуске gulp.start()будет заменено управление задачами .... так что будет ломаться.

Истинное намерение дизайна gulp - сделать обычные функции Javascript и сделать задачу только для их вызова.

Пример:

function getJsFiles() {
    var sourcePaths = [
        './app/scripts/**/*.js',
        '!./app/scripts/**/*.spec.js',
        '!./app/scripts/app.js'
    ];

    var sources = gulp.src(sourcePaths, { read: false }).pipe(angularFilesort());

    return gulp.src('./app/index.html')
        .pipe(injector(sources, { ignorePath: 'app', addRootSlash: false }))
        .pipe(gulp.dest('./app'));
}  

gulp.task('js', function () {
    jsStream = getJsFiles();
});

12

Простите, что воскресил старый вопрос. Принятый ответ не решает проблему запуска задач до установки часов. В следующем ответе используется gulp.start, который уходит. Третий ответ указывает на то, что следует использовать обычные функции, но пример кажется странным. Я немного поискал, но не нашел простого примера.

Вот мое решение. Идея состоит в том, чтобы определить обычные js-функции, а затем зарегистрировать их как задачи. Затем функции могут быть вызваны напрямую, если это необходимо, или из часов.

var 
  gulp     = require('gulp'),
  concat   = require('gulp-concat'),
  markdown = require('gulp-showdown')
;
var scriptFiles   = [ 'ang/app.js' ];
var markdownFiles = [ 'content/articles/*.md'];

var watchTask = function() 
{
  buildTask();

  gulp.watch(scriptFiles,  ['scripts' ]);
  gulp.watch(markdownFiles,['markdown']);
};
gulp.task('watch',watchTask);

var buildTask = function()
{
  scriptsTask();
  markdownTask();
};
gulp.task('build',buildTask);

var markdownTask = function() 
{
  gulp.src(markdownFiles)
    .pipe(markdown())
    .pipe(gulp.dest('web/articles'));
};
gulp.task('markdown',markdownTask);

var scriptsTask = function() 
{
  gulp.src(scriptFiles)
    .pipe(concat('app.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js',
      'bower_components/angular-route/angular-route.min.js'
    ])
    .pipe(concat('vendor.js'))
    .pipe(gulp.dest('web/js'));

  gulp.src(
    [
      'bower_components/angular/angular.min.js.map',
      'bower_components/angular-route/angular-route.min.js.map'
    ])
    .pipe(gulp.dest('web/js'));
};
gulp.task('scripts', scriptsTask);

Я новичок в глотке. Пожалуйста, дайте мне знать, если я пропустил что-то очевидное.


Это также упрощает создание задач «сборки» и задач «перестройки», где обе вызывают функцию, которая выполняет работу, но последняя также зависит от «чистой» задачи.
Сет,

1
Разве это не та же проблема, что и обычная задача gulp, поскольку JS перейдет к gulp.watchзадачам, определенным в, watchTask()прежде чем buildTask()будет подтверждено завершение? Я чувствую, что это все еще состояние гонки и не гарантирует сборку перед просмотром.
Шон Райан,

7

глоток 4

gulp.parallel('taskName1', 'taskName2')()
gulp.series('taskName1', 'taskName2')()

Мне нравится gulp4!


Лучший ответ после долгих поисков. Спасибо.
AminFarajzadeh

5

Как упоминает @dman, gulp.startв следующей версии он будет удален . Также это можно увидеть в этом выпуске gulp .

А в комментариях к ответу @Pavel Evstigneev @joemaller упоминает, что в этом сценарии мы можем использовать run-sequence .

Но обратите внимание, что автор run-sequence говорит:

Это должно быть временным решением до выпуска gulp 4.0, который поддерживает определение зависимостей задач последовательно или параллельно.

Имейте в виду, что это решение является взломом и может перестать работать с будущим обновлением gulp.

Итак, до gulp 4.0 мы можем использовать run-sequence , после 4.0 мы можем просто использовать gulp.


3

Если вам нужно поддерживать порядок выполнения задач, вы можете определить зависимости, как описано здесь - вам просто нужно вернуть поток из зависимости:

gulp.task('dependency', function () {
  return gulp.src('glob')
    .pipe(plumber())
    .pipe(otherPlugin())
    .pipe(gulp.dest('destination'));
});

Определите задачу, которая от этого зависит:

gulp.task('depends', [ 'dependency' ], function () {
  // do work
});

И используйте это с часов:

gulp.task('watch', function () {
  watch('glob', [ 'depends' ]);
});

Теперь dependecyзадача будет завершена перед dependsзапуском (например, ваши задачи «жасмин» и «встраивание» будут зависимостями, и у вас будет другой «сервер» задачи, который будет зависеть от них). Никаких хаков не требуется.


Я не уверен, что это не по теме, потому что он отвечает только на вопросы из комментариев, которые должны быть отдельными вопросами
klh

2

В Gulp 4 мне кажется, что единственное, что работает, это:

gulp.task('watch', function() {
    gulp.watch(['my-files/**/*'], gulp.series('my-func'));
});

gulp.task('my-func', function() {
    return gulp.src('[...]').pipe(gulp.dest('...'));
});

1

Чтобы запустить задачу перед началом просмотра, вместо использования gulp.run () или gulp.start () просто запустите команду gulp прямо вверх.

Так что вместо:

var compress = function () {
    return gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));
};

Просто сделать:

gulp.src('js/vendor/*.js')
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest('./build/js/'));

Или вы можете заключить этот последний код в «обычную» функцию и вызывать ее, когда захотите.

- Вдохновленный этим ответом из аналогичной ветки .


0

Я до сих пор не понимаю, как это на самом деле решает поставленный вопрос.

Если у меня есть 4 задачи, между которыми определены зависимости

А, Б, В, D

где A зависит от B и т.д., как определено gulp.task('A',['B'],function A(){}); а затем я определил новую задачу, используя gulp.watch, запуск только функций, дублировал бы зависимости.

например, учитывая эти задачи (каждая функция задачи отображается через имя):

function A(){}
gulp.task('A',['B'],A);

function A(){}
gulp.task('A',['B'],A);

function B(){}
gulp.task('B',['C'],B);

function C(){}
gulp.task('C',['D'],C);

function D(){}
gulp.task('D',[],D);

я могу написать 1)

gulp.task('WATCHER', ['A'], function(){
   ...
}

который будет выполнять A-> D, но если, например, шаг B не удастся, он никогда не войдет в задачу (подумайте об ошибке компиляции или тестирования)

или я могу написать 2)

gulp.task('WATCHER', [], function(){
   gulp.watch(...,['A'])
}

который не будет запускать A-> D, пока что-то не будет сначала изменено.

или я могу написать 3)

gulp.task('WATCHER', [], function(){
   D();
   C();
   B();
   A();
   gulp.watch(...,['A'])
}

что может вызвать дублирование (и со временем ошибки) иерархии зависимостей.

PS: В случае, если кому-то интересно, почему я хочу, чтобы моя задача слежения выполнялась, если какая-либо из зависимых задач терпит неудачу, обычно это связано с тем, что я использую часы для разработки в реальном времени. например. Я запускаю свою задачу слежения, чтобы начать работу над тестами и т. д., и может быть, что исходный код, с которого я начинаю, уже имеет проблемы, следовательно, ошибки.

Так что я надеюсь, что gulp run или что-то подобное останется в течение некоторого времени


На какой из существующих ответов направлено это опровержение?
Mogsdad
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.