gulp.run kullanımdan kaldırıldı. Nasıl görev oluşturabilirim?


97

İşte onu görev bağımlılıkları ile nasıl değiştireceğimi bilmediğim oluşturulmuş bir görev.

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

İlgili değişiklik günlüğü https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#35 [kullanımdan kaldır gulp.run]

Yanıtlar:


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

Artık görevleri çalıştırmak için bir işlevi (yine de yapabilirsiniz) geçirmenize gerek yok. Watch'a bir dizi görev adı verebilirsiniz ve o bunu sizin için yapacaktır.


13
Ya izlemeye başlamadan önce bir görev yürütmek istersem? Örneğin izlemek istiyorum scripts, ancak bu görevi hemen çalıştırmaya zorlamak da mantıklıdır (bazı komut dosyası değişikliklerini beklemeden).
Monsignor

4
Ve bu görevlere argüman aktarmanın bir yolu var mı?
Dr Ernie

7
@rachel, Monsingor'un sorduğu soruyla alakasız.
Mark Amery

6
@Monsingor Bunu başarmak için, bir görev listesi yürüten yeni bir görev tanımlayabilirsiniz. Örneğin, genellikle gulp.task('default', ['build', 'watch']);önce oluşturulan ve ardından izlemeye başlayan aşağıdaki varsayılan görevi tanımlıyorum .
Bastiaan van den Berg

1
@BastiaanvandenBerg Gulp görevlerinin paralel çalışacak şekilde tasarlandığını sanıyordum? Bu nedenle, önce derlemeyi listeliyor olsanız bile, izleme görevi çalışmadan önce bitirmek zorunda değildir. Operatörlükten, saat başlamadan önce yapının tamamlandığından emin olmak istediklerini anlıyorum.
Sean Ryan

85

Veya bunun gibi yapabilirsiniz:

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

3
Bunu kullanmak güvenli mi? API belgelerinde (bağlantı) bahsedildiğini görmüyorum .
Felix Rabe

4
.startbir Orkestratör yöntemidir. Gulp bundan miras aldığı için işe yaramalı. Yutmayan bir işlevden (watchify) bir yudum görevini tetikliyorum ve bu çalışıyor gibi görünüyor.
joemaller

24
gulp.startsonraki sürümde kaldırılacak: github.com/gulpjs/gulp/issues/505#issuecomment-45379280
yckart

13
@yckart peki bir görevi yerine getirmek için ne kullanıyoruz?
chovy

6
Bunu tersine çevirerek, çoğu kullanım npmjs.com/package/run-sequencegulp-start ile değiştirilebilirrun-sequence
joemaller

25

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

gulp.start()hiçbir zaman halka açık bir API olması veya kullanılmaması amaçlandı. Ve yukarıda yorumlarda belirtildiği gibi, görev yönetimi bir sonraki sürümde değiştirilecek .... dolayısıyla gulp.start()bozulacak.

Yutkun tasarımın gerçek amacı, düzenli Javascript işlevleri yapmak ve yalnızca bunları çağırmak için görevi yapmaktır.

Misal:

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

Eski bir soruyu dirilttiğim için beni bağışlayın. Kabul edilen cevap, saatleri ayarlamadan önce görevlerin çalıştırılması sorununu ele almıyor. Bir sonraki cevap, gitmekte olan gulp.start'ı kullanır. Üçüncü cevap, normal fonksiyonların kullanılması gerektiğine işaret ediyor, ancak örnek garip görünüyor. Biraz araştırma yaptım ama basit bir örnek bulamadım.

İşte benim çözümüm. Buradaki fikir, normal js işlevlerini tanımlamak ve ardından bunları görevler olarak kaydetmektir. Fonksiyonlar daha sonra gerekirse doğrudan veya bir saatin içinden çağrılabilir.

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

Ben yutkunmada yeniyim. Açık olan bir şeyi gözden kaçırdıysam lütfen bana bildirin.


Bu aynı zamanda "derleme" görevleri oluşturmayı ve görevleri "yeniden oluşturmayı" kolaylaştırır, burada her ikisi de işi yapan işlevi çağırır, ancak ikincisi de "temiz" göreve bağlıdır.
Seth

1
Bu aynı zamanda normal bir yudum göreviyle aynı soruna sahip değil midir, çünkü JS'nin daha önce gulp.watchtanımlanmış görevlere geçeceği, tamamlandığı onaylanmadan? Bunun hala bir yarış durumu olduğunu ve saatten önce inşa etmeyi garanti etmediğini düşünüyorum. watchTask()buildTask()
Sean Ryan

7

yutkunma 4

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

Gulp4'ü severim!


Çok aradıktan sonra en iyi cevap. Teşekkürler.
AminFarajzadeh

5

@Dman'ın bahsettiği gibi, gulp.startsonraki sürümde atılacak. Ayrıca yudumun bu sayısında da görülebilir .

Ve @Pavel Evstigneev'in cevabının yorumlarında, @joemaller bu senaryoda run-sequence'i kullanabileceğimizden bahsediyor .

Ancak, run-sequence'in yazarının şöyle dediğini lütfen unutmayın:

Bu, görev bağımlılıklarını seri veya paralel olarak tanımlamayı destekleyen gulp 4.0'ın piyasaya sürülmesine kadar geçici bir çözüm olması amaçlanmıştır.

Bu çözümün bir bilgisayar korsanlığı olduğunu ve ileride yapılacak bir güncelleme ile çalışmayı durdurabileceğini unutmayın.

Yani, yutkunma 4.0'dan önce, çalışma sırasını kullanabiliriz , 4.0'dan sonra, yudum kullanabiliriz.


3

Çalışan görevlerin sırasını korumanız gerekiyorsa, bağımlılıkları burada açıklandığı gibi tanımlayabilirsiniz - yalnızca bağımlılıktan akışı döndürmeniz gerekir:

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

Buna bağlı olan görevi tanımlayın:

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

Ve saatten kullan:

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

Artık dependecygörev dependsçalıştırılmadan önce tamamlanacaktır (örneğin, 'yasemin' ve 'yerleştirme' görevleriniz bağımlılıklar olacaktır ve bunlara bağlı başka bir görev 'sunucunuz' olacaktır). Hacklemeye gerek yok.


Konu dışı olup olmadığından emin değilim, çünkü yalnızca ayrı sorular olması gereken yorumlardan gelen soruları yanıtlıyor
klh

2

Gulp 4'te benim için işe yarayan tek şey şudur:

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

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

1

İzlemeye başlamadan önce bir görevi çalıştırmak için gulp.run () veya gulp.start () kullanmak yerine gulp komutunu doğrudan çalıştırın.

Yani bunun yerine:

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

Sadece yap:

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

Ya da bu ikinci kodu "normal" bir işleve sarabilir ve istediğiniz zaman çağırabilirsiniz.

- Benzer bir başlıktaki bu cevaptan esinlenilmiştir .


0

Hala bunun eldeki soruyu nasıl çözdüğünü anlamıyorum.

Aralarında tanımlanmış bağımlılıkları olan 4 görevim varsa

A, B, C, D

burada A, B'ye bağlıdır, vb. tarafından tanımlandığı gibi gulp.task('A',['B'],function A(){});ve sonra gulp.watch kullanarak yeni bir görev tanımladım, sadece işlevleri çalıştıran bağımlılıkları çoğaltacaktır.

örneğin bu görevler verildiğinde (her bir görev işlevi adla gösterilir):

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

yazabilirim 1)

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

bu A-> D'yi çalıştırır, ancak örneğin Adım B başarısız olursa asla göreve girmez (derleme veya test hatasını düşünün)

ya da yazabilirim 2)

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

ilk önce bir şey değiştirilene kadar A-> D çalıştırmaz.

ya da yazabilirim 3)

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

bağımlılık hiyerarşisinin tekrarlanmasına (ve zamanla hatalara) neden olur.

Not: Birisi, bağımlı görevlerden herhangi biri başarısız olursa neden saat görevimin yürütülmesini istediğimi merak ederse, bunun nedeni genellikle canlı geliştirme için izle kullanmamdır. Örneğin. Testler vb. üzerinde çalışmaya başlamak için saat görevimi başlatıyorum ve başladığım ilk kodda zaten sorunlar ve dolayısıyla hatalar olabilir.

Bu yüzden bir yudum kaçışının veya eşdeğerinin bir süre daha kalmasını umuyorum


Bu çürütme hangi mevcut yanıtı hedefliyor?
Mogsdad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.