2017-02-16 9 views
2

Я пытаюсь написать рабочий процесс с Глотком 4 (см ниже конкретной информацией версии), которая будетКак заставить Gulp4 ждать задач записи файлов, чтобы конкурировать?

  1. смотреть локальную папку для .html файла
  2. полосы нескольких таблиц на отдельные файлы .html в таблице
  3. преобразовать указанные таблицы в .csv для дальнейшей обработки
  4. очистить временный каталог, все эти файлы тоже сброшены.

Проблема, с которой я столкнулся, неважно, что я пытаюсь. Я не могу заставить мою задачу очистки ждать, пока остальные задачи будут записывать файлы на диск. Я попытался вложить функции сбора данных, включая все методы изменения в один длинный поток, и несколько других неуклюжих решений, предлагаемых здесь и в других местах - никто из них не работает. Любые указатели были бы большой помощью.

var gulp = require('gulp'); 
 
var exec = require('child_process').exec; 
 
var rename = require('gulp-rename'); 
 
var inject = require('gulp-inject-string'); 
 
var htmlSplit = require('gulp-htmlsplit'); 
 
var del = require('del'); 
 

 
// Clean all non-csv files from ./data/temp 
 
function clean() { 
 
    return del(['data/temp/*', '!data/temp/*.csv']); 
 
} 
 

 
// Convert HTML tables to CSV files 
 
function convertCSV(filename) { 
 
    return exec('node node_modules/html-table-to-csv data/temp/' + filename + '.html data/temp/' + filename + '.csv'); 
 
} 
 

 
// Move a renamed copy of original report to .data/temp/ 
 
function getData() { 
 
    return gulp.src('data/report/*.html') 
 
    .pipe(rename('injected.html')) 
 
    .pipe(gulp.dest('data/temp')); 
 
} 
 

 
// Inject split start comments before each <table> tag 
 
function injectBefore() { 
 
    return gulp.src('data/temp/*.html') 
 
    .pipe(inject.beforeEach('<table', '<!-- split table.html -->\n')) 
 
    .pipe(gulp.dest('data/temp')); 
 
} 
 

 
// Inject split stop comments after each </table> tag 
 
function injectAfter() { 
 
    return gulp.src('data/temp/*.html') 
 
    .pipe(inject.afterEach('</table>', '\n<!-- split stop -->')) 
 
    .pipe(gulp.dest('data/temp')); 
 
} 
 

 
// Split each table into its own HTML file for CSV conversion 
 
function htmlCSV(done) { 
 
    var i = 0; 
 
    return gulp.src('data/temp/injected.html') 
 
    .pipe(htmlSplit()) 
 
    .pipe(rename(function(file) { 
 
     // Append unique number to end of each HTML file 
 
     file.basename += i >= 9 ? ++i : '0' + ++i; 
 
     // Send unique numbered HTML file to convertCSV() 
 
     convertCSV(file.basename);  
 
    })) 
 
    .pipe(gulp.dest('data/temp')); 
 
    done(); 
 
} 
 

 
gulp.task('default', gulp.series(getData, injectBefore, injectAfter, htmlCSV, clean)); 
 

 
// FILE STRUCTURE 
 
// analytics 
 
// |_bower_components 
 
// |_data 
 
// |_report <-- Original report in HTML dumped here 
 
// |_temp <-- Injected and converted files dumped here 
 
// |_node_modules 
 
// |_gulpfile.js and other files 
 
// 
 
// Gulp - CLI version 1.2.2 
 
// Gulp - Local version 4.0.0-alpha.2 
 
// Node - v6.9.5 
 
// NPM - 3.10.10 
 
// OS - Windows 7 6.1.7601 Service pack 1 Build 7601

+0

Отвечая это потребует полная переписывание, вы смешиваете синхронизацию и асинхронный код вместе. задачи gulp ожидают возвращенный поток или обратный вызов конца, который должен быть запущен. Позвольте мне посмотреть, что я могу придумать с – SteveLacy

ответ

1

Я удалил обычный плагины глотка и фактическое преобразование CSV, как это просто child_process исполнения.

Основная проблема с вашим кодом заключается в том, что ядро ​​Node child_process.exec является Asnyc и не вернет конец, если вы не добавите обратный вызов. Замена его на sync-exec позволит выполнить вызов процесса синхронизации, так как обратный вызов gulp-rename не имеет обратного вызова.

var gulp = require('gulp'); 
 
var exec = require('sync-exec'); 
 
var rename = require('gulp-rename'); 
 
var del = require('del'); 
 

 
// Clean all non-csv files from ./data/temp 
 
function clean() { 
 
    return del(['temp']); 
 
} 
 

 
// Convert HTML tables to CSV files 
 
function convertCSV(filename) { 
 
    // return exec('node node_modules/html-table-to-csv data/temp/' + filename + '.html data/temp/' + filename + '.csv'); 
 
    return exec('sleep 5;'); 
 
} 
 

 
// Move a renamed copy of original report to .data/temp/ 
 
function getData() { 
 
    return gulp.src('t.html') 
 
    .pipe(gulp.dest('temp/')); 
 
} 
 

 
// Split each table into its own HTML file for CSV conversion 
 
function htmlCSV() { 
 
    var i = 0; 
 
    return gulp.src('t.html') 
 
    .pipe(rename(function(file) { 
 
     // Append unique number to end of each HTML file 
 
     file.basename += i >= 9 ? ++i : '0' + ++i; 
 
     // Send unique numbered HTML file to convertCSV() 
 
     convertCSV(file.basename); 
 
    })) 
 
    .pipe(gulp.dest('dist')); 
 
} 
 

 
gulp.task('default', gulp.series(getData, htmlCSV, clean));

+1

Спасибо за ваше направление Стив. Я новичок в Gulp в целом и просто переключился на Gulp 4 сегодня. Я обязательно вернусь в документацию, чтобы лучше понять вещи, но это помогло мне зайти в то же время. Еще раз спасибо. К сожалению, поскольку я новичок в SO, мой голос не публикуется публично, но я проголосовал за это. – Sn3aKyGuY

+0

Спасибо, да, gulp 4 добавляет много приятных функций. Ожидание некоторых обновлений зависимостей, прежде чем мы опубликуем их – SteveLacy

0

Использование ES7 асинхронной/Await синтаксиса, а также util.promisify ждать его до конца:

const util = require('util'); 
const exec = util.promisify(require('child_process').exec); 

// Convert HTML tables to CSV files 
async function convertCSV(filename) { 
    return await exec('node node_modules/html-table-to-csv', 
    ['data/temp/' + filename + '.html', 
    'data/temp/' + filename + '.csv']); 
} 

Нет необходимости для сторонних библиотек