Gulp RSync - 将进度保存到日志文件

时间:2016-08-18 17:30:24

标签: javascript node.js gulp rsync logfile

我一直在使用gulp-rsync通过gulp任务将静态资产部署到我的服务器。我使用增量选项来确定是否需要更新文件。这很好用:))

我需要将控制台中显示的进度保存在文件或其他任何内容中。 因为我需要在cloudflare上清除缓存中的单个文件:/

看起来那样(在控制台中):

[20:49:52] Starting 'rsync'...
[20:49:53] gulp-rsync: Starting rsync to my-ssh-hostname:/example/public-html/assets/...
[20:49:55] gulp-rsync: sending incremental file list
[20:49:57] gulp-rsync: favicon.ico
[20:49:57] gulp-rsync:         1150 100%  439.45kB/s    0:00:00 (xfer#1, to-check=12/13)
[20:49:57] gulp-rsync: css/main.css
[20:49:57] gulp-rsync:         2712 100%  101.86kB/s    0:00:00 (xfer#2, to-check=11/13)
[20:49:57] gulp-rsync: css/style.css
[20:49:57] gulp-rsync:         1445 100%   54.27kB/s    0:00:00 (xfer#3, to-check=9/13)
[20:49:57] gulp-rsync: js/app.js
[20:49:57] gulp-rsync:        31878 100%    1.09MB/s    0:00:00 (xfer#7, to-check=3/13)
[20:49:57] gulp-rsync: scripts.js
[20:50:01] gulp-rsync:        76988 100%    2.53MB/s    0:00:00 (xfer#9, to-check=1/13)
[20:50:01] gulp-rsync: sent 2401 bytes  received 2820 bytes  10442.00 bytes/sec
[20:50:02] gulp-rsync: total size is 10106  speedup is 4.37
[20:50:02] gulp-rsync: Finished 'rsync' after 3.38 s

我需要保存并解压缩日志中的文件:

favicon.ico,
css/main.css,
css/style.css, 
js/app.js, 
scripts.js

- 我原来的“ gulpfile.js ”:

var
  gulp = require('gulp'),
  gutil = require('gulp-util'),
  rsync = require('gulp-rsync'),
  logCapture = require('gulp-log-capture');

var config = {
  hostname : 'my-ssh-hostname',
  destination : '/example/public-html/assets/',
  progress: true,
  incremental: true,
  relative: true,
  emptyDirectories: true,
  recursive: true,
  clean: true,
  exclude: ['._', '.DS_Store' , 'thumbs.db', 'desktop.ini'],
  chmod: '775',
};

gulp.task('rsync', function (){
  return gulp.src('./my-local-dir/' + '**/*')
    .pipe(rsync(config))
});

- 我找到了“ Gulp的日志捕获插件” - gulp-log-capture

什么是正确的使用方式? :/

gulp.task('rsync', function (){
  return gulp.src('./my-local-dir/' + '**/*')
    .pipe(logCapture.start(process.stdout, 'write'))
    .pipe(rsync(config))
    .pipe(logCapture.stop('txt'))
    .pipe(gulp.dest('./dest'));
});

任何sugestions将是apreciated:)

1 个答案:

答案 0 :(得分:0)

由于gulp-log-capture的工作方式,您无法使用gulp-rsync

gulp-rsync等待它在调用rsync之前收集了所有文件名。否则,它必须为每个单独的文件调用rsync,这会严重降低性能。

因此,在调用rsynclogCapture已停止捕获日志输出。

您需要监听'end'事件并通过将process.stdout.write()替换为您自己的函数(这是gulp-log-capture所做的)来自己捕获日志输出:

gulp.task('rsync', function (){
  var logOutput = "";
  var stdoutWrite;
  return gulp.src('./my-local-dir/' + '**/*')
    .on('end', function() {
      stdoutWrite = process.stdout.write;
      process.stdout.write = function(output) { logOutput += output; };
    })
    .pipe(rsync(config))
    .on('end', function() {
      process.stdout.write = stdoutWrite;
      process.stdout.write(logOutput);
      fs.writeFileSync('./dest/logOutput.txt', new Buffer(logOutput));
    });
});

这会将rsync生成的进度日志存储在logOutput变量中,并将其写入文件./dest/logOutput.txt

logOutput中提取文件名现在只是提出适当的正则表达式。我会把那部分留给你。如果这给您带来麻烦,最好在向人们询问。