गल्प त्रुटि: निम्नलिखित कार्य पूर्ण नहीं हुए: क्या आप एस्सिप पूरा होने का संकेत देना भूल गए?


211

मेरे पास निम्न gulpfile.js हैं , जिन्हें मैं कमांड लाइन gulp संदेश के माध्यम से निष्पादित कर रहा हूं :

var gulp = require('gulp');

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

मुझे निम्न त्रुटि संदेश मिल रहा है:

[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?

मैं विंडोज 10 सिस्टम पर gulp 4 का उपयोग कर रहा हूं। यहाँ से उत्पादन है gulp --version:

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

1
यदि आप यहाँ हैं क्योंकि आपके पास कोई समस्या है webpack-stream। इसका प्रयोग करें: github.com/shama/webpack-stream/issues/…
B3none

जवाबों:


448

चूंकि आपके कार्य में एसिंक्रोनस कोड हो सकता है, इसलिए आपको अपने कार्य को पूरा करने के बाद (= "async पूर्णता") समाप्त होने पर gulp को संकेत देना होगा।

गुलप 3.x में आप ऐसा किए बिना दूर हो सकते हैं। यदि आपने स्पष्ट रूप से async को पूरा करने का संकेत नहीं दिया है, तो यह माना जाएगा कि आपका कार्य तुल्यकालिक है और जैसे ही यह समाप्त होता है, आपका कार्य पूरा हो जाता है। इस संबंध में गुल 4.x सख्त है। आप के लिए है स्पष्ट रूप से कार्य पूरा होने का संकेत।

आप इसे छह तरीकों से कर सकते हैं :

1. एक स्ट्रीम लौटें

यह वास्तव में एक विकल्प नहीं है यदि आप केवल कुछ प्रिंट करने की कोशिश कर रहे हैं, लेकिन यह संभवतः सबसे अधिक इस्तेमाल किया जाने वाला एस्किंस पूरा करने वाला तंत्र है क्योंकि आप आमतौर पर गल्प स्ट्रीम के साथ काम कर रहे हैं। यहां आपके उपयोग के मामले के लिए इसका प्रदर्शन करते हुए एक (बल्कि वंचित) उदाहरण दिया गया है:

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

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

यहाँ महत्वपूर्ण हिस्सा returnबयान है। यदि आप स्ट्रीम वापस नहीं करते हैं, तो स्ट्रीम समाप्त होने पर gulp निर्धारित नहीं कर सकता है।

2. वापसी एक Promise

यह आपके उपयोग के मामले के लिए एक बहुत अधिक फिटिंग तंत्र है। ध्यान दें कि अधिकांश समय आपको Promiseस्वयं ऑब्जेक्ट बनाने की आवश्यकता नहीं होगी , यह आमतौर पर एक पैकेज द्वारा प्रदान किया जाएगा (उदाहरण के लिए अक्सर उपयोग किए जाने वाला delपैकेज रिटर्न)Promise )।

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

एसिंक्स / वेट सिंटैक्स का उपयोग करके इसे और भी सरल बनाया जा सकता है। सभी कार्यों को asyncस्पष्ट रूप से एक वादा वापस लौटाएं ताकि निम्नलिखित कार्य भी हो सकें (यदि आपका नोड.जेएस संस्करण इसका समर्थन करता है ):

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

3. कॉलबैक फ़ंक्शन को कॉल करें

यह संभवतः आपके उपयोग के मामले का सबसे आसान तरीका है: अपने तर्क के रूप में अपने कार्य के लिए कॉलबैक फ़ंक्शन स्वचालित रूप से पास हो जाता है। जब आप कर रहे हों तो बस उस फ़ंक्शन को कॉल करें:

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

4. वापसी एक बच्चे की प्रक्रिया

यह ज्यादातर उपयोगी है अगर आपको कमांड लाइन टूल को सीधे इनवॉइस करना है क्योंकि कोई नोड नहीं है। जेपी रैपर उपलब्ध है। यह आपके उपयोग के मामले के लिए काम करता है, लेकिन जाहिर है मैं इसकी सिफारिश नहीं करूंगा (विशेषकर चूंकि यह बहुत पोर्टेबल नहीं है):

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

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

5. एक आरएक्सजेएस लौटाएंObservable

मैंने इस तंत्र का उपयोग कभी नहीं किया है, लेकिन यदि आप RxJS का उपयोग कर रहे हैं तो यह उपयोगी हो सकता है। यदि आप कुछ प्रिंट करना चाहते हैं तो यह ओवरकिल की तरह है:

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. वापसी एक EventEmitter

पिछले एक की तरह मैं इसे संपूर्णता के लिए शामिल कर रहा हूं, लेकिन यह वास्तव में ऐसा कुछ नहीं है जिसका आप उपयोग करने जा रहे हैं जब तक कि आप पहले से ही EventEmitterकिसी कारण से उपयोग नहीं कर रहे हों ।

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
कुछ घंटों की गुगली के बाद, मुझे यह उदाहरण मिला। बहुत मददगार। धन्यवाद!
पैक्सटर

यह मेरे लिए उपयोगी है, ths!
आनं

1
मैं आपके उत्तर की सराहना करता हूं। +1 बड़ा समय।
कोनराड विल्टर्स्टन

6
मैंने 17 नवंबर को आपके सुरुचिपूर्ण और जानकारीपूर्ण उत्तर की सराहना की। और आज, क्रिसमस के दिन, मैं फिर से इसकी सराहना कर रहा हूं। यह उन मामलों में से एक है जब मैं चाहता हूं कि मैं +2 का पुरस्कार दे सकता हूं ... मुझे विश्वास नहीं हो रहा है कि "खोज निम्न कार्यों को पूरा नहीं किया गया " या " क्या आपने किया था जब goolearching इस लिंक को शीर्ष # 1 के रूप में नहीं बताता है "
एसिंक्स

"अक्सर इस्तेमाल किया जाने वाला डेल पैकेज एक वादा करता है"। मैं डेल का उपयोग कर रहा हूं, हालांकि मैं वादे का फायदा उठाने के लिए अपना gulp कोड कैसे लिखूं? (पीएस। बिल्कुल अद्भुत जवाब! +1)
डैनियल टोनन

84

गुल 4 के साथ एक मुद्दा

इस समस्या को हल करने के लिए अपने वर्तमान कोड को बदलने का प्रयास करें:

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

इस में उदाहरण के लिए:

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

या इसमें:

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

2
करने के लिए लापता कॉल मेरा मुद्दा था। आपके उत्तर के लिए धन्यवाद!
मार्को सांताक्रॉ

1
हालाँकि, इस बात से अवगत रहें कि तीर के कार्यों का कोई अलग दायरा नहीं है।
जेपीजेड

19

यह काम किया!

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

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

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

2
यह सबसे अच्छा जवाब है
Văn Quyết

13

मैं एक ही सरल SASS / CSS चलाने की कोशिश में यह त्रुटि प्राप्त कर रहा था बिल्ड ।

मेरा समाधान (जो समान या समान त्रुटियों को हल कर सकता है) बस doneडिफ़ॉल्ट कार्य फ़ंक्शन में एक पैरामीटर के रूप में जोड़ने के लिए था , और इसे डिफ़ॉल्ट कार्य के अंत में कॉल करने के लिए:

// 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.
})

उम्मीद है की यह मदद करेगा!


7
वास्तविक कार्य सामग्री के साथ एक उदाहरण देखकर अच्छा लगा
जोनाथन

8

आपको दो काम करने होंगे:

  1. asyncफ़ंक्शन से पहले जोड़ें ।
  2. अपने फंक्शन की शुरुआत करें return

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

7

मैं इस पर बहुत जानकार होने का दावा नहीं कर सकता, लेकिन मुझे भी यही समस्या थी और मैंने इसे हल कर दिया।

एक async फ़ंक्शन का उपयोग करके इसे हल करने का एक 7 वां तरीका है ।

अपने फ़ंक्शन को लिखें लेकिन उपसर्ग async जोड़ें ।

ऐसा करने से गुलप एक वादे में फ़ंक्शन लपेटता है, और कार्य त्रुटियों के बिना चलेगा।

उदाहरण:

async function() {
  // do something
};

संसाधन:

  1. गुलप पृष्ठ Async पूर्णता पर अंतिम खंड : Async / प्रतीक्षा का उपयोग करना

  2. मोज़िला async कार्य डॉक्स


7

यह एक समस्या है जब gulp संस्करण 3 से 4 में माइग्रेट किया जा रहा है, बस आप कॉल बैक फंक्शन में किए गए पैरामीटर को जोड़ सकते हैं, उदाहरण देखें,

   const gulp = require("gulp")

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

5

समाधान: हमें कॉलबैक फ़ंक्शन (कार्य और बेनामी) को कॉल करने की आवश्यकता है:

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

2

यहाँ आप जाते हैं: कोई समकालिक कार्य नहीं

कोई समकालिक कार्य नहीं

तुल्यकालिक कार्य अब समर्थित नहीं हैं। वे अक्सर सूक्ष्म गलतियों का नेतृत्व करते थे जो कठिन थे, जैसे किसी कार्य से अपनी धाराओं को वापस करना भूल जाना।

जब आप Did you forget to signal async completion?चेतावनी देखते हैं , तो ऊपर वर्णित तकनीकों में से कोई भी उपयोग नहीं किया गया था। आपको समस्या को हल करने के लिए त्रुटि-प्रथम कॉलबैक का उपयोग करना होगा या स्ट्रीम, वादा, ईवेंट एमिटर, चाइल्ड प्रक्रिया या अवलोकन योग्य लौटना होगा।

का उपयोग कर async/await

पिछले विकल्पों में से किसी का उपयोग नहीं करने पर, आप अपने कार्य को एक के रूप में परिभाषित कर सकते हैं async function, जो आपके कार्य को एक वादे में लपेटता है । यह आपको awaitअन्य सिंक्रोनस कोड का उपयोग करने और उपयोग करने के वादे के साथ काम करने की अनुमति देता है ।

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

मूल रूप से v3.X सरल था लेकिन v4.x तुल्यकालिक और अतुल्यकालिक कार्यों के इन साधनों में सख्त है।

Async / इंतजार बहुत सरल और कार्यप्रवाह और मुद्दे को समझने के उपयोगी तरीका है।

इस सरल दृष्टिकोण का उपयोग करें

const gulp = require('gulp')

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

1

मैं हाल ही में इसके साथ संघर्ष कर रहा था, और एक बनाने का सही तरीका पाया default कार्यsass तब चलता sass:watchथा:

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

1

मेरा समाधान: async के साथ सब कुछ डाल दिया और gulp इंतजार कर रहा है।

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;

0

डिफ़ॉल्ट फ़ंक्शन में पैरामीटर के रूप में किया गया जोड़ें। करना होगा।


0

उन लोगों के लिए जो स्वैगर स्थानीय तैनाती के लिए गल्प का उपयोग करने की कोशिश कर रहे हैं, निम्नलिखित कोड मदद करेंगे

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

मेरे लिए यह मुद्दा अलग था: कोणीय-पंजा स्थापित नहीं था (मैंने एनवीएम का उपयोग करके एक नया नोड संस्करण स्थापित और बस कोणीय क्ली को पुनर्स्थापित करना भूल गया था)

आप "एनजी संस्करण" चलाने की जांच कर सकते हैं।

यदि आपके पास यह नहीं है तो बस "npm install -g @ angular / cli" चलाएं


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.