Gulp hatası: Aşağıdaki görevler tamamlanmadı: Zaman uyumsuz tamamlandığını bildirmeyi unuttunuz mu?


212

Komut satırı gulp mesajı ile yürüttüğüm aşağıdaki gulpfile.js var :

var gulp = require('gulp');

gulp.task('message', function() {
  console.log("HTTP Server Started");
});

Aşağıdaki hata iletisini alıyorum:

[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?

Windows 10 sisteminde gulp 4 kullanıyorum. İşte çıktı gulp --version:

[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

1
Eğer buradaysan çünkü bir sorunun var webpack-stream. Bunu kullanın: github.com/shama/webpack-stream/issues/…
B3none

Yanıtlar:


448

Göreviniz eşzamansız kod içerebileceğinden, göreviniz tamamlandığında (= "eşzamansız tamamlama") gulp sinyali vermeniz gerekir.

Gulp 3.x'te bunu yapmadan kurtulabilirsiniz. Async tamamlama yutuculuğunu açıkça belirtmediyseniz, görevinizin senkronize olduğunu ve görev işleviniz geri döner dönmez biteceğini varsayarsınız. Gulp 4.x bu konuda daha katıdır. Sen zorunda açıkça görev tamamlandığına işaret.

Bunu altı şekilde yapabilirsiniz :

1. Bir Akış Döndürme

Bu, yalnızca bir şey yazdırmaya çalışıyorsanız gerçekten bir seçenek değildir, ancak genellikle gulp akışlarıyla çalıştığınız için muhtemelen en sık kullanılan asenkron tamamlama mekanizmasıdır. Kullanım durumunuz için bunu gösteren (oldukça çelişkili) bir örnek:

var print = require('gulp-print');

gulp.task('message', function() {
  return gulp.src('package.json')
    .pipe(print(function() { return 'HTTP Server Started'; }));
});

Burada önemli olan returnifade. Akışı geri döndürmezseniz gulp, akışın ne zaman bittiğini belirleyemez.

2. Geri dön Promise

Bu, kullanım durumunuz için çok daha uygun bir mekanizmadır. Çoğu zaman Promisenesneyi kendiniz oluşturmak zorunda kalmayacağınıza, genellikle bir paket tarafından sağlanacağına dikkat edin (örneğin, sık kullanılan delpaket a döndürür Promise).

gulp.task('message', function() { 
  return new Promise(function(resolve, reject) {
    console.log("HTTP Server Started");
    resolve();
  });
});

Kullanılması zaman uyumsuz / bekliyoruz sözdizimi bu daha da kolaylaşır edilebilir. asyncÖrtük olarak işaretlenen tüm işlevler bir Promise döndürür, böylece aşağıdakiler de çalışır ( node.js sürümünüz destekliyorsa ):

gulp.task('message', async function() {
  console.log("HTTP Server Started");
});

3. Geri arama işlevini çağırın

Bu muhtemelen kullanım durumunuz için en kolay yoldur: gulp otomatik olarak görevinize ilk argüman olarak bir geri çağrı işlevi iletir. İşiniz bittiğinde bu işlevi çağırmanız yeterlidir:

gulp.task('message', function(done) {
  console.log("HTTP Server Started");
  done();
});

4. Bir alt süreci iade edin

Bu, çoğunlukla bir node.js sarmalayıcısı olmadığından doğrudan bir komut satırı aracını çağırmanız gerektiğinde yararlıdır. Kullanım durumunuz için çalışır, ancak kesinlikle tavsiye etmem (özellikle çok taşınabilir olmadığı için):

var spawn = require('child_process').spawn;

gulp.task('message', function() {
  return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});

5. Bir RxJS döndürünObservable .

Bu mekanizmayı hiç kullanmadım, ancak RxJS kullanıyorsanız faydalı olabilir. Sadece bir şey yazdırmak istiyorsanız biraz aşırıya kaçmak:

var of = require('rxjs').of;

gulp.task('message', function() {
  var o = of('HTTP Server Started');
  o.subscribe(function(msg) { console.log(msg); });
  return o;
});

6. Geri dön EventEmitter

Birincisi gibi bunu tamlık uğruna ekliyorum, ancak bir EventEmitternedenden dolayı zaten kullanmadığınız sürece gerçekten kullanacağınız bir şey değil .

gulp.task('message3', function() {
  var e = new EventEmitter();
  e.on('msg', function(msg) { console.log(msg); });
  setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
  return e;
});

4
Birkaç saat çalıştıktan sonra bu örneği buldum. Çok yararlı. Teşekkür ederim!
paxtor

benim için yararlı, ths!
Anan

1
Cevabınızı takdir ediyorum. +1 büyük zaman.
Konrad Viltersten

6
17 Kasım'da zarif ve bilgilendirici yanıtınızı takdir ettim. Ve bugün, Noel günü, tekrar tekrar takdir ediyorum. Bu, +2 ödüllendirebilmeyi istediğim durumlardan biri ... Goolearching'in " Aşağıdaki görevler tamamlanmadı " veya " Yaptınız mı? zaman
uyumsuzluğunun

msgstr "sık kullanılan del paketi bir söz veriyor". Del kullanıyorum, söz vermeden yararlanmak için küfür kodumu nasıl yazarım? (PS. Kesinlikle şaşırtıcı cevap! +1)
Daniel Tonon

84

Gulp 4 ile ilgili bir konu .

Bu sorunu çözmek için mevcut kodunuzu değiştirmeyi deneyin:

gulp.task('simpleTaskName', function() {
  // code...
});

örneğin buna:

gulp.task('simpleTaskName', async function() {
  // code...
});

ya da buna:

gulp.task('simpleTaskName', done => {
  // code...
  done();
});

2
Yapılan eksik çağrı benim sorunumdu. Cevabınız için teşekkür ederim!
Marco Santarossa

1
Ancak, ok işlevlerinin ayrı bir kapsamı olmadığını unutmayın.
JepZ

19

Bu işe yaradı!

gulp.task('script', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('css', done => {
    // ... code gulp.src( ... )
    done();
});

gulp.task('default', gulp.parallel(
        'script',
        'css'
  )
);

2
bu en iyi cevaptır
Văn Quyết

13

Bu aynı hatayı çok basit bir SASS / CSS derlemesi çalıştırmaya çalışıyordum .

Çözümüm (aynı veya benzer hataları çözebilir) donevarsayılan görev işlevine parametre olarak eklemek ve varsayılan görevin sonunda çağırmaktı:

// Sass configuration
var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    gulp.src('*.scss')
        .pipe(sass())
        .pipe(gulp.dest(function (f) {
            return f.base;
        }))
});

gulp.task('clean', function() {
})

gulp.task('watch', function() {
    gulp.watch('*.scss', ['sass']);
})


gulp.task('default', function(done) { // <--- Insert `done` as a parameter here...
    gulp.series('clean','sass', 'watch')
    done(); // <--- ...and call it here.
})

Bu yardımcı olur umarım!


7
Gerçek görev içeriklerine sahip bir örnek görmek güzel
Jonathan

8

İki şey yapmanız gerekiyor:

  1. İşlevden asyncönce ekleyin .
  2. İle fonksiyonunuzu başlatın return.

    var gulp = require('gulp');
    
    gulp.task('message', async function() {
        return console.log("HTTP Server Started");
    });

7

Bu konuda çok bilgili olduğunu iddia edemem ama aynı sorunu yaşadım ve çözdüm.

Zaman uyumsuz bir işlev kullanarak bunu çözmenin 7. yolu vardır .

İşlevinizi yazın ancak zaman uyumsuz önekini ekleyin .

Bunu yaparak Gulp işlevi bir söze sarar ve görev hatasız çalışır.

Misal:

async function() {
  // do something
};

Kaynaklar:

  1. Gulp sayfasındaki son bölüm Asenkron Tamamlama : Async / await kullanma .

  2. Mozilla zaman uyumsuz dokümanlar işlev görür .


7

Bu, gulp sürüm 3'ten 4'e geçerken bir sorundur, Geri arama işlevine yapılan bir parametreyi ekleyebilirsiniz, örneğe bakın,

   const gulp = require("gulp")

    gulp.task("message", function(done) {
      console.log("Gulp is running...")
      done()
    });

5

Çözüm: Geri arama işlevlerini (Görev ve Anonim) çağırmamız gerekir:

function electronTask(callbackA)
{
    return gulp.series(myFirstTask, mySeccondTask, (callbackB) =>
    {
        callbackA();
        callbackB();
    })();    
}

2

İşte: Senkronize görev yok .

Eşzamanlı görev yok

Eşzamanlı görevler artık desteklenmemektedir. Genellikle, akışlarınızı bir görevden geri almayı unutmak gibi hata ayıklaması zor ince hatalara yol açtılar.

Did you forget to signal async completion?Uyarıyı gördüğünüzde, yukarıda belirtilen tekniklerin hiçbiri kullanılmadı. Sorunu çözmek için önce hata geri aramasını kullanmanız veya bir akış, söz, olay gönderici, alt süreç veya gözlemlenebilir geri göndermeniz gerekir.

async/ Kullanmaawait

Önceki seçeneklerden herhangi birini kullanmadığınızda async function, görevinizi bir söz olarak saran bir olarak tanımlayabilirsiniz . Bu, awaitdiğer senkron kodları kullanarak senkronize vaatlerle çalışmanıza ve kullanmanıza olanak tanır .

const fs = require('fs');

async function asyncAwaitTask() {
  const { version } = fs.readFileSync('package.json');
  console.log(version);
  await Promise.resolve('some result');
}

exports.default = asyncAwaitTask;

2

Temel olarak v3.X daha basitti, ancak v4.x bu eşzamanlı ve eşzamansız görevler için katıdır.

Zaman uyumsuz / bekliyoruz oldukça basit ve iş akışını ve sorunu anlamak için yararlı bir yoldur.

Bu basit yaklaşımı kullanın

const gulp = require('gulp')

gulp.task('message',async function(){
return console.log('Gulp is running...')
})

1

Ben oluşturmak için doğru yolu son zamanlarda bununla mücadele ve bulunmuştur defaultçalışır görevi sassdaha sonra sass:watcholdu:

gulp.task('default', gulp.series('sass', 'sass:watch'));

1

Benim çözümüm: her şeyi async ile koy ve yutmayı bekle.

async function min_css() {
    return await gulp
        .src(cssFiles, { base: "." })
        .pipe(concat(cssOutput))
        .pipe(cssmin())
        .pipe(gulp.dest("."));
}

async function min_js() {
    return await gulp
        .src(jsFiles, { base: "." })
        .pipe(concat(jsOutput))
        .pipe(uglify())
        .pipe(gulp.dest("."));  
}

const min = async () => await gulp.series(min_css, min_js);

exports.min = min;

1

Bir şey yapmanız gerekiyor:

  • İşlevden asyncönce ekleyin .

const gulp = require('gulp');

gulp.task('message', async function() {
    console.log("Gulp is running...");
});


0

Varsayılan işlevde parametre olarak yapılan ekleme. Yapacak.


0

Swagger yerel dağıtımı için gulp kullanmaya çalışanlar için aşağıdaki kod yardımcı olacaktır

var gulp = require("gulp");
var yaml = require("js-yaml");
var path = require("path");
var fs = require("fs");

//Converts yaml to json
gulp.task("swagger", done => {
    var doc = yaml.safeLoad(fs.readFileSync(path.join(__dirname,"api/swagger/swagger.yaml")));
    fs.writeFileSync(
        path.join(__dirname,"../yourjsonfile.json"),
        JSON.stringify(doc, null, " ")
        );
    done();
});

//Watches for changes    
gulp.task('watch', function() {
  gulp.watch('api/swagger/swagger.yaml', gulp.series('swagger'));  
});

0

Benim için sorun farklıydı: Angular-cli yüklenmedi (NVM kullanarak yeni bir Node sürümü kurdum ve açısal cli yeniden kurmayı unuttum)

Çalışan "ng sürümünü" kontrol edebilirsiniz.

Eğer yoksa sadece "npm install -g @ angular / cli" komutunu çalıştırın.

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.