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 [deprecate 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, але також має сенс змусити виконувати це завдання відразу (не чекаючи, поки деякі файли сценарію не зміняться).
Монсеньйор

4
І чи є спосіб передавати аргументи на ці завдання?
доктор Ерні

7
@rachel не має значення для запитання, яке задав Монсінгор.
Марк Амері

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

1
@BastiaanvandenBerg Я думав, що задачі із глоткою розроблені для паралельної роботи? Тож хоч ви перераховуєте збірку спочатку, вона не повинна закінчуватись до запуску завдання перегляду. Я отримую від ОП, що вони хочуть забезпечити завершення будівництва до початку перегляду.
Шон Райан

85

Або ви можете зробити так:

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

3
Це безпечно у використанні? Я не бачу його згадування в документах API (посилання) .
Фелікс Рабе

4
.startє методом Оркестратора. Оскільки Gulp успадковує це, він повинен працювати. Я запускаю завдання gulp від функції non gulp (watchify), і це, здається, працює.
joemaller

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

13
@yckart, що ж ми використовуємо для виконання завдання?
chovy

6
Звертаючись до цього, більшість застосувань gulp-startможна замінити на run-sequence npmjs.com/package/run-sequence
joemaller

25

джерело: https://github.com/gulpjs/gulp/isissue/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
Хіба це також не має тієї ж проблеми, що і звичайна задача із глоткою, оскільки JS перейде до gulp.watchзавдань, визначених watchTask()раніше buildTask(), підтверджено завершеним? Я відчуваю, що це все ще є умовою гонки, і не гарантує побудови перед переглядом.
Шон Райан

7

ковтати 4

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

Мені подобається gulp4!


Найкраща відповідь після багато пошуків. Дякую.
AminFarajzadeh

5

Як зазначає @dman, gulp.startце буде відкинуто в наступній версії. Також це можна побачити в цьому випуску проковтнути .

І в коментарях відповіді @Pavel Євстігнеєва @joemaller зазначає, що ми можемо використовувати послідовність запуску в цьому сценарії.

Але зауважте, що автор послідовності запуску каже:

Це має бути тимчасовим рішенням до виходу gulp 4.0, який підтримує визначення залежностей задач послідовно або паралельно.

Майте на увазі, що це рішення є хакерським рішенням, і може припинити роботу з майбутнім оновленням, щоб gulp.

Отже, перед gulp 4.0 ми можемо використовувати послідовність запуску , після 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запуском (наприклад, ваші завдання "жасмин" та "вставити" були б залежностями, і у вас був би ще один сервер завдань, який залежав би від них). Не потрібно жодних хак.


Я не впевнений, чи це не тематично, тому що він відповідає лише на запитання з коментарів, які мають бути окремими питаннями
Killah

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 завдання із залежностями, визначеними між ними

А Б В Г

де 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: Якщо хтось задається питанням, чому я хотів би виконати завдання, яке слід виконувати, якщо якесь із залежних завдань провалиться, це зазвичай тому, що я використовую годинник для розвитку в реальному часі. напр. я запускаю завдання перегляду, щоб почати працювати над тестами і т. д., і може бути так, що початковий код, з якого я починаю, вже має проблеми, таким чином, помилки.

Тож я би сподівався, що ковтати чи якийсь еквівалент залишається деякий час


На яку існуючу відповідь спрямовано це спростування?
Могсдад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.