javascript - 如何让 Gulp4 等待文件写入任务竞争?

标签 javascript gulp node.js-stream

我正在尝试使用 Gulp 4(具体版本信息见下文)编写工作流

  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

最佳答案

我删除了常规的 gulp 插件和实际的 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));

关于javascript - 如何让 Gulp4 等待文件写入任务竞争?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42283219/

相关文章:

javascript - 如何使用nodejs查找相似文本

javascript - 在 HTML5 中从 sql 检索数据

javascript - 在 Angular.js 中使用预设变量添加用户输入的数字

javascript - Gulp uglify 打破 Angular 应用

typescript 、AMD 和模块名称

javascript - 需要用Javascript替换 "$"为 "_"

javascript - 任务完成时如何通知 Gulp?

node.js - Node JS : Uncork() method on writable stream doesn't really flush the data

javascript - Node.js "write after end"错误

node.js - 管道到标准输出和可写流