如何让Gulp4等待文件写入任务参与竞争?

时间:2017-02-16 19:44:05

标签: javascript gulp node.js-stream

我正在尝试使用Gulp 4编写工作流程(请参阅下面的特定版本信息)

  1. 观看.html文件的本地文件夹
  2. 将每个表格中的多个表格删除为单个.html文件
  3. 将所述表格转换为.csv进行进一步处理
  4. 清理所有这些文件的临时目录。
  5. 我遇到的问题是无论我尝试什么,我无法让我的清洁任务等待其余任务将文件写入磁盘。我已经尝试将数据收集功能嵌套到一个长流中,并在这里和其他地方提供了一些其他笨拙的解决方案 - 但它们都没有工作。任何指针都会有很大的帮助。

    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

2 个答案:

答案 0 :(得分:1)

我删除了常规的gulp插件和实际的csv转换,因为这只是child_process执行。

您的代码的主要问题是节点核心child_process.exec是Asnyc,除非您添加回调,否则不会返回结尾。用sync-exec替换它将允许同步进程调用,因为gulp-rename回调没有回调。

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用es7 async / 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']);
}

不需要第三方库