3

我试图在我的 package.json 文件中增加版本号,然后使用更新版本号来创建一个新的 git 标签。每当我运行碰撞任务时,创建的 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
一些谷歌搜索使它看起来像是一个异步与同步的问题,所以在阅读了这篇博文后,我创建了两个任务来测试它。

tag取决于bump完成,最大的变化是凹凸任务中的返回语句。日志输出显示它们正在按顺序执行,但问题仍然存在。

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 和流如何工作的新手,所以如果我的标题没有意义,请告诉我。我想更新它,使其与搜索结果更相关。

提前致谢。

4

2 回答 2

5

您很可能被require 使用缓存的事实所困扰...

您的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);
});
于 2014-03-02T21:12:22.193 回答
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('./'));
});
于 2014-03-03T01:31:30.303 回答