【问题标题】:Failing to get updated contents of a file after gulp stream completesgulp 流完成后无法获取文件的更新内容
【发布时间】:2014-03-02 04:41:53
【问题描述】:

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

我正在使用gulp-load-plugins 注册我的所有插件并将它们映射到$,而不必手动声明它们。所以我只使用$.bump() 而不是var bump = require("gulp"); ... 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
一些谷歌搜索使它看起来像是一个异步与同步问题,所以在阅读 this 博客文章后,我创建了两个任务来测试这一点。

tag 依赖于 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);
  });
});

那么知道问题出在哪里吗?它仍然是异步与同步问题,我做错了什么吗?我宁愿只在一项任务中拥有逻辑,但如果他们完成这项任务的唯一方法是两项,那就这样吧。

我是 gulp 和流如何工作的新手,所以如果我的标题没有意义,请告诉我。我想对其进行更新,使其与搜索结果更相关。

提前致谢。

【问题讨论】:

    标签: javascript node.js gulp


    【解决方案1】:

    require uses caching...

    您的require('package.json') 调用可能会返回bump() 操作之前的(缓存)版本。您应该尝试直接阅读它(例如:避免 require)。

    更新

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

    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);
    });
    

    【讨论】:

    • 我刚刚用node的文件系统测试了这个,仍然使用require,仍然得到旧版本的版本号。我会将我测试过的代码块添加到我的主帖中。
    • 您的最后一个示例(#4)也不好,因为您不再等待碰撞完成! (这是两个不同的问题)。再试一次你的 #2 示例,并使用 fs.readFileSync 之类的东西而不是 require('package.json')。
    • 我也试过了,但没有把它作为例子。结果相同。我稍后会更新这篇文章,以涵盖所有场景。可能是这段代码 sn-p 之外的东西导致了这种情况吗?我在一个小的 gulp helper utility 中使用这个逻辑,想看看吗?
    • 我用你的#2中的一个工作示例更新了答案,使用 fs (而不是要求)。它确实工作。
    • 啊,你把它分成两个任务。我回家后会试一试。知道这是否可以在单个任务中完成吗?
    【解决方案2】:

    我通过使用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('./'));
    });
    

    【讨论】:

    • 如上所述,这将在新版本的 package.json 文件写入之前git tag - 这可能不是您想要的。
    • @manangled-deutz 确实会在 package.json 文件写入磁盘之前获取标签,但这并不重要,因为它在碰撞任务更新配置后访问内存中的流。这在我在其他评论中提到的 git repo 中对我有用。
    • 如果您对结果感到满意,那么就是这样 :-) - 现在,使用版本 1.0.0 标记某些内容似乎有点奇怪,而提交的 package.json 文件会表示这是 0.9.0 版。无论如何,最好的问候。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    相关资源
    最近更新 更多