gulp stream完成后无法获取文件的更新内容

时间:2014-03-02 04:41:54

标签: javascript node.js gulp

我正试图在我的package.json文件中删除版本号,然后使用更新版本号创建一个新的git标记。每当我运行bump任务时,创建的git标签都是旧的版本号,而不是碰撞的版本号。

我正在使用gulp-load-plugins注册我的所有插件并将它们映射到$,而不是必须手动声明它们。因此,我只使用var bump = require("gulp"); ... bump()而不是$.bump()

尝试#1
我的初始代码看起来像这样。

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();

gulp.task('bump', function() {
  gulp.src(['package.json'])
    .pipe($.bump())
    .pipe(gulp.dest('./'));

  var config = require('./package.json');
  $.git.tag('v' + config.version, 'Version message');
  $.util.log("tag added: " + config.version);
});

尝试#2
一些谷歌搜索似乎是一个异步vs同步问题,所以在阅读this博客文章后,我创建了两个任务来测试它。

tag依赖于bump完成,大变化是bump任务中的return语句。日志输出显示它们按顺序执行,但问题仍然存在。

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();

gulp.task('bump', function() {
  return gulp.src(['package.json'])
    .pipe($.bump())
    .pipe(gulp.dest('./'));
});    

gulp.task('tag',['bump'], function() {
  var config = require('./package.json');
  $.git.tag('v' + config.version, 'Version message');
  $.util.log("tag added: " + config.version);
});

尝试#3
我也尝试将git标签逻辑移动到碰撞中的.on('close')事件中,但这也无法解决我的问题。

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();

gulp.task('bump', function() {
  return gulp.src(['package.json'])
    .pipe($.bump())
    .pipe(gulp.dest('./'))
    .on('close', function () {
      var config = require('./package.json');
      $.git.tag('v' + config.version, 'Version message');
      $.util.log("tag added: " + config.version);
    });
});

尝试#4
还尝试Mangled-Deutz建议不使用require('package.json'),因为require可能会缓存结果。我尝试使用节点文件系统的readFile()方法,但这也没有成功。

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();
var fs = require('fs');

gulp.task('bump', function() {
  gulp.src(['package.json'])
    .pipe($.bump())
    .pipe(gulp.dest('./'));

  fs.readFile("./package.json", {encoding: 'utf-8'}, function (err, data) {
    var config = JSON.parse(data);
    $.git.tag('v' + config.version, 'Version message');
    $.util.log("tag added: " + config.version);
  });
});

那么问题出在哪里?它仍然是异步vs同步问题,我做错了吗?我宁愿把逻辑放在一个任务中,但是如果他们只想实现这个就是两个,那就这样吧。

我是gulp的新手以及溪流是如何运作的,所以如果我的标题没有意义,请告诉我。我想更新它,以便与搜索结果更相关。

提前致谢。

2 个答案:

答案 0 :(得分:5)

你很可能被require uses caching ...

这一事实所困扰

require('package.json')来电可能会在bump()操作之前返回(缓存)版本。你应该尝试直接阅读它(例如:避免要求)。

<强>更新

以下 按预期工作 - 如上所述:

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();
var fs = require('fs');

gulp.task('bump', function() {
  return gulp.src(['package.json'])
    .pipe($.bump())
    .pipe(gulp.dest('./'));
});

gulp.task('tag', ['bump'], function() {
// This doesn't work, because require uses caching
//  var config = require('./package.json');
  var config = fs.readFileSync('./package.json', 'utf-8');
  console.warn(config);
});

答案 1 :(得分:0)

我使用gulp-tap插件找到了一个解决方案,它允许您访问管道流并读取/修改它。虽然这就是我想要的,但我仍然想知道是否有非插件方法来实现这一点,或者我的其他尝试是什么问题。

var gulp = require("gulp");
var $ = require('gulp-load-plugins')();

gulp.task('bump', function() {
  gulp.src(['package.json'])
    .pipe($.bump())
    .pipe($.tap( function (file, t) {
        var config = JSON.parse(file.contents.toString());
        $.git.tag('v' + config.version, 'Version message');
        $.util.log("new tag " + config.version);
      }))
    .pipe(gulp.dest('./'));
});