gulp.run tidak digunakan lagi. Bagaimana cara saya membuat tugas?

97

Ini adalah tugas yang saya tidak tahu bagaimana menggantinya dengan dependensi tugas.

...
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');
 });
});

Changelog terkait https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#35 [deprecate gulp.run]

toutpt
sumber

Jawaban:

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']);
});

Anda tidak perlu lagi meneruskan fungsi (meskipun Anda masih bisa) untuk menjalankan tugas. Anda dapat memberikan arloji berbagai nama tugas dan itu akan melakukan ini untuk Anda.

Kontra
sumber
13
Bagaimana jika saya ingin menjalankan beberapa tugas sebelum saya mulai menonton? Misalnya saya ingin menonton scripts, tetapi masuk akal juga untuk memaksa menjalankan tugas ini segera (tanpa menunggu sampai beberapa file skrip berubah).
Monsinyur
4
Dan adakah cara untuk menyampaikan argumen ke tugas-tugas itu?
Dr. Ernie
7
@rachel tidak relevan dengan pertanyaan yang diajukan Monsingor.
Mark Amery
6
@Monsingor Untuk mencapai itu, Anda dapat menetapkan tugas baru yang menjalankan daftar tugas. Misalnya, saya biasanya menentukan tugas default berikut gulp.task('default', ['build', 'watch']);, yang pertama dibangun dan kemudian mulai menonton.
Bastiaan van den Berg
1
@BastiaanvandenBerg Saya pikir tugas gulp dirancang untuk berjalan secara paralel? Jadi, meskipun Anda mencantumkan build terlebih dahulu, itu tidak harus selesai sebelum tugas jam diaktifkan. Saya mendapatkan dari OP bahwa mereka ingin memastikan build telah selesai sebelum jam tangan dimulai.
Sean Ryan
85

Atau Anda bisa melakukan seperti ini:

gulp.start('task1', 'task2');
Pavel Evstigneev
sumber
3
Apakah ini aman digunakan? Saya tidak melihatnya disebutkan dalam dokumen API (tautan) .
Felix Rabe
4
.startadalah metode Orchestrator. Karena Gulp mewarisi dari itu, itu harus bekerja. Saya memicu tugas gulp dari fungsi non-gulp (watchify) dan ini tampaknya berfungsi.
joemaller
24
gulp.startakan dihapus di rilis berikutnya: github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart
13
@yckart jadi apa yang kita gunakan untuk menjalankan tugas?
chovy
6
Membatalkan ini, sebagian besar penggunaan gulp-startdapat diganti dengan run-sequence npmjs.com/package/run-sequence
joemaller
25

sumber: https://github.com/gulpjs/gulp/issues/755

gulp.start()tidak pernah dimaksudkan untuk menjadi api publik atau digunakan. Dan seperti yang dinyatakan di atas dalam komentar, manajemen tugas sedang diganti di rilis berikutnya .... jadi gulp.start()akan melanggar.

Maksud sebenarnya dari desain gulp adalah membuat fungsi Javascript biasa, dan hanya membuat tugas untuk memanggilnya.

Contoh:

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();
});
dman
sumber
12

Maafkan saya karena menghidupkan kembali pertanyaan lama. Jawaban yang diterima tidak membahas masalah menjalankan tugas sebelum mengatur jam tangan. Jawaban selanjutnya menggunakan gulp.start yang akan ditiadakan. Jawaban ketiga menunjukkan bahwa fungsi reguler harus digunakan tetapi contohnya tampak aneh. Saya melakukan beberapa pencarian tetapi tidak menemukan contoh sederhana.

Inilah solusi saya. Idenya adalah untuk mendefinisikan fungsi js biasa kemudian mendaftarkannya sebagai tugas. Fungsi tersebut kemudian dapat dipanggil secara langsung jika diperlukan atau dari dalam jam tangan.

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);

Saya baru menelan. Tolong beri tahu saya jika saya melewatkan sesuatu yang jelas.

Cerad
sumber
Ini juga membuatnya lebih mudah untuk membuat tugas "membangun" dan "membangun kembali", di mana keduanya memanggil fungsi yang melakukan pekerjaan tetapi yang terakhir bergantung pada tugas "bersih" juga.
Seth
1
Bukankah ini juga memiliki masalah yang sama dengan tugas gulp normal, di mana JS akan beralih ke gulp.watchtugas yang ditentukan watchTask()sebelum buildTask()dikonfirmasi selesai? Saya merasa ini masih kondisi balapan, dan tidak menjamin membangun sebelum menonton.
Sean Ryan
7

teguk 4

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

Saya Suka gulp4!

vomvoru
sumber
Jawaban terbaik setelah banyak mencari. Terima kasih.
AminFarajzadeh
5

Seperti yang disebutkan @dman, gulp.startakan dibuang di versi berikutnya. Juga bisa dilihat dalam edisi teguk ini .

Dan pada komentar jawaban @Pavel Evstigneev, @joemaller menyebutkan bahwa run-sequence dalam skenario ini bisa kita gunakan .

Tapi harap dicatat bahwa, penulis run-sequence mengatakan:

Ini dimaksudkan sebagai solusi sementara hingga rilis gulp 4.0 yang memiliki dukungan untuk mendefinisikan dependensi tugas secara seri atau paralel.

Ketahuilah bahwa solusi ini adalah peretasan, dan mungkin berhenti berfungsi dengan pembaruan di masa mendatang.

Jadi, sebelum gulp 4.0, kita bisa menggunakan run-sequence , setelah 4.0 kita bisa menggunakan gulp saja.

Qianyue
sumber
3

Jika Anda perlu mempertahankan urutan tugas yang sedang berjalan, Anda dapat menentukan dependensi seperti yang dijelaskan di sini - Anda hanya perlu mengembalikan streaming dari dependensi:

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

Tentukan tugas yang bergantung padanya:

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

Dan gunakan dari jam tangan:

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

Sekarang dependecytugas akan selesai sebelum dependsdijalankan (misalnya tugas 'melati' dan 'embed' Anda akan menjadi dependensi dan Anda akan memiliki tugas 'server' lain yang akan bergantung padanya). Tidak perlu peretasan apa pun.

klh
sumber
Saya tidak yakin apakah itu tidak keluar topik, karena ini hanya menjawab pertanyaan dari komentar yang seharusnya menjadi pertanyaan terpisah
klh
2

Di Gulp 4, satu-satunya hal yang tampaknya berhasil bagi saya adalah:

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

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

Untuk menjalankan tugas sebelum mulai menonton, alih-alih menggunakan gulp.run () atau gulp.start (), cukup jalankan perintah gulp langsung ke atas.

Jadi, alih-alih:

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

Kerjakan saja:

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

Atau Anda dapat menggabungkan kode yang terakhir itu dalam fungsi "normal" dan memanggilnya kapan pun Anda mau.

- Terinspirasi oleh jawaban ini dari utas serupa .

bergie3000
sumber
0

Saya masih tidak melihat bagaimana ini benar-benar menyelesaikan pertanyaan yang ada.

Jika saya memiliki 4 tugas dengan dependensi yang ditentukan di antara mereka

A, B, C, D

di mana A bergantung pada B, dll seperti yang didefinisikan oleh gulp.task('A',['B'],function A(){});dan kemudian saya mendefinisikan tugas baru menggunakan gulp.watch yang menjalankan hanya fungsi akan menduplikasi dependensi.

misalnya diberikan tugas-tugas ini (setiap fungsi tugas diekspos melalui nama):

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);

saya bisa menulis 1)

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

yang akan mengeksekusi A-> D tetapi jika misalnya Langkah B gagal itu tidak akan pernah masuk tugas (pikirkan kompilasi atau uji kesalahan)

atau saya bisa menulis 2)

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

yang tidak akan menjalankan A-> D sampai sesuatu diubah terlebih dahulu.

atau saya bisa menulis 3)

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

yang akan menyebabkan duplikasi (dan error seiring waktu) hierarki dependensi.

PS: Jika seseorang bertanya-tanya mengapa saya ingin tugas jam tangan saya dijalankan jika ada tugas dependen yang gagal, biasanya karena saya menggunakan jam tangan untuk pengembangan langsung. misalnya. saya memulai tugas jam tangan saya untuk mulai mengerjakan tes, dll. dan bisa jadi kode awal yang saya mulai sudah memiliki masalah sehingga kesalahan.

Jadi saya berharap bahwa gulp run atau yang setara tetap ada untuk beberapa waktu

mgoetzke.dll
sumber
Jawaban manakah yang menjadi sasaran sanggahan ini?
Mogsdad