[gulp] Gulp 오류 : 다음 작업이 완료되지 않았습니다. 비동기 완료를 신호하는 것을 잊었습니까?

다음과 같은 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?

Windows 10 시스템에서 gulp 4를 사용하고 있습니다. 출력은 다음과 같습니다 gulp --version.

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



답변

작업에 비동기 코드가 포함될 수 있으므로 작업 실행이 완료되면 꿀꺽 소리를 내야합니다 (= “비동기 완료”).

Gulp 3.x에서는이 작업을 수행하지 않고도 벗어날 수 있습니다. 비동기 완료를 명시 적으로 신호하지 않으면 gulp는 작업이 동 기적이며 작업 함수가 반환되는 즉시 완료된 것으로 가정합니다. Gulp 4.x는 이와 관련하여 더 엄격합니다. 당신은 할 필요가 명시 적으로 작업 완료 신호.

6 가지 방법으로 이를 수행 할 수 있습니다 .

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 / await 구문을 사용하면 이 과정을 더욱 단순화 할 수 있습니다. 표시된 모든 함수는 async내재적으로 Promise를 반환하므로 다음도 작동합니다 ( node.js 버전에서 지원하는 경우 ).

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

3. 콜백 함수를 호출

이것은 아마도 유스 케이스에 가장 쉬운 방법 일 것입니다 : gulp는 콜백 함수를 첫 번째 인수로 자동으로 작업에 전달합니다. 완료되면 해당 함수를 호출하십시오.

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

4. 자식 프로세스를 반환

사용 가능한 node.js 랩퍼가 없기 때문에 명령 행 도구를 직접 호출해야하는 경우에 유용합니다. 그것은 당신의 유스 케이스에서 작동하지만 분명히 나는 ​​그것을 추천하지 않을 것입니다 (특히 이식성이 좋지 않기 때문에).

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

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

5. RxJS를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;
});


답변

Gulp 4의 문제 .

이 문제를 해결하려면 현재 코드를 변경하십시오.

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

예를 들면 다음과 같습니다.

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

또는 이것으로 :

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


답변

이것은 효과가 있었다!

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

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

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


답변

매우 간단한 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.
})

도움이 되었기를 바랍니다!


답변

다음 두 가지를 수행해야합니다.

  1. async기능 전에 추가하십시오 .
  2. 로 기능을 시작하십시오 return.

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

답변

나는 이것에 대해 매우 잘 알고 있다고 주장 할 수는 없지만 같은 문제가있어서 해결했습니다.

async function 을 사용하여이를 해결하는 7 번째 방법이 있습니다 .

함수를 작성하되 접두어 async를 추가하십시오 .

이렇게하면 Gulp가 약속 한대로 기능을 감싸고 작업이 오류없이 실행됩니다.

예:

async function() {
  // do something
};

자원:

  1. Gulp 페이지의 마지막 섹션 비동기 완료 : async / await 사용 .

  2. Mozilla 비동기 함수 문서 .


답변

이것은 gulp 버전 3에서 4로 마이그레이션 할 때 발생하는 문제입니다. 간단히 콜백 함수에 수행 된 매개 변수를 추가 할 수 있습니다 (예 :

   const gulp = require("gulp")

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