我正试图在我的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的新手以及溪流是如何运作的,所以如果我的标题没有意义,请告诉我。我想更新它,以便与搜索结果更相关。
提前致谢。
答案 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('./'));
});