2016-06-21 56 views
2

Gulp的作品幾乎很棒。它監視並正確運行任務,除非它處於運行任務的中間,它不會一直在監視與該任務相關的文件,以便在最後一項任務完成時再次運行任務。gulp手錶並不總是在任務中觀看

[08:30:51] Starting 'composer'... 
composer task 
Loading composer repositories with package information 
Installing dependencies (including require-dev) from lock file 
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them. 
Nothing to install or update 
Generating autoload files 
Process exited with code 0 
[08:30:53] Finished 'composer' after 1.62 s 

編輯:不介意短時間;這只是一個不好的例子。我真正運行的任務在10-15s內運行,在這段時間內,我可以進行其他相關更改並保存,這是現實的。

編輯composer.lock文件時會觸發此操作。

已經編輯了composer.lock文件和任務後,已經開始運行,編輯和在時間「作曲的任務」是輸出再次保存composer.lock,

預計:任務後,再次運行完成

實際:任務完成並不會重新運行,以適應該發生的,因爲

我使用Ubuntu上一口關注這些變化。

+0

我明白你的問題,但你爲什麼要這麼做?我的意思是編輯和保存,而運行的一部分。 – KRONWALLED

+0

爲了一個現實的例子,說我正在運行一個任務將TypeScript編譯成JavaScript。如果我編寫了一些東西並保存,然後運行編譯器任務,然後在運行時我做了一些快速的相關更改,然後第一個任務完成,但任務不再運行:那麼編譯的JS文件的狀態將不匹配因爲編譯任務沒有再次運行,所以源文件的源代碼文件。 –

+0

您在1.62秒內快速進行相關更改?我希望有人對此有一個答案,因爲我也對它感興趣,但我無法想象解決方案,因爲通常在編譯時不會更改代碼。 – KRONWALLED

回答

2

這不是gulp.watch()在運行任務時沒有看到。儘管gaze中有一個debounceDelay option,它可以防止在某個時間窗口內發生相同的事件,但它很短,所以不太可能會碰到它。您可以嘗試將其設置爲0,但這可能會導致比解決問題更多的問題。

更可能的原因是orchestrator根本不運行任務if it is already running

Orchestrator的將確保每一項任務和每一個相關性的業務流程運行過程中即使您指定它運行超過一次運行一旦。 [...]如果您需要它多次運行任務,請等待編排結束(開始的回調),然後再次調用啓動。

我其實可以通過模擬使用setTimeout()長時間運行的任務,重現您的問題:

gulp.task('task', function (done) { 
    setTimeout(done, 10000); 
}); 

gulp.task('watch', function() { 
    gulp.watch('some_file.txt', {debounceDelay:0}, ['task']); 
}); 

我能想出的唯一的事情要解決,這是手動跟蹤任務是否已經運行然後在執行任務完成後安排重新運行:

function runTask(taskName) { 
    var running = false; 
    var rerun = false; 
    return function() { 
    if (running) { 
     rerun = true; 
    } 
    running = true; 
    gulp.start(taskName, function() { 
     if (rerun) { 
     rerun = false; 
     gulp.start(taskName); 
     } else { 
     running = false; 
     } 
    }); 
    }; 
} 

gulp.task('task', function (done) { 
    setTimeout(done, 10000); 
}); 

gulp.task('watch', function() { 
    gulp.watch('some_file.txt', {debounceDelay:0}, runTask('task')); 
}); 
+0

你的回答很酷,但如果我保存3個文件,我的構建需要15s。我將不得不等待45秒才能得到結果?在理想的世界中,我應該可以取消任務並再次運行它。我一直在尋找https://github.com/kingmotley/gulp-debounced-watch,它使用https://github.com/paulmillr/chokidar,但沒有成功 – CESCO

+0

這不是一個理想的世界。您無法取消任務,並且在任務已經運行時無法啓動任務。 (和debouncing不是問題,看我的答案。) –

+0

這很糟糕。必須有另一種選擇!謝謝@Sven – CESCO