Gulp - 重新编译用于标记的碰撞版本

时间:2014-10-14 16:21:02

标签: javascript node.js build gulp

关于issue I am having with gulp-tag-version,自述文件建议:

function inc(importance) {
    // get all the files to bump version in
    return gulp.src(['./package.json', './bower.json']) 
        // bump the version number in those files
        .pipe(bump({type: importance}))
        // save it back to filesystem
        .pipe(gulp.dest('./'))

        /*  Recompile the Javascript here */

        // commit the changed version number
        .pipe(git.commit('bumps package version')) 
        // read only one file to get the version number
        .pipe(filter('package.json'))
        // **tag it in the repository**
        .pipe(tag_version()) 
}

gulp.task('patch', function() { return inc('patch'); })
gulp.task('feature', function() { return inc('minor'); })
gulp.task('release', function() { return inc('major'); })

我想在被碰撞的版本和git标记它之间重新编译一些Javascript。我有一个任务,js,但不清楚如何调用js任务(或以其他方式重新排序碰撞/标记任务)来实现这个共同和理想的结果(即在已编译代码的标题中包含该版本。)

值得注意的是,如果一个人有三个任务bumpcompiletag,则bump的{​​{1}}似乎会被缓存,不能通过单独的package.json任务重新阅读。

1 个答案:

答案 0 :(得分:7)

实现这一目标的一个简单方法是获得3个相互依赖的新独立任务:

  • tag取决于commit,因为标记将应用于我们之前必须执行的最后一次提交
  • commit取决于js,因为我们应该使用碰撞版本重新构建文件
  • js取决于bump,在执行任何操作之前删除清单文件的版本
  • bump没有依赖关系。

问题在于,您必须更改js以添加bump依赖项,并且我确定您不希望每次重新编译时都遇到问题或者你的一个watch被触发。

所以你可以使用像 run-sequence 这样的东西来绕过它。

我喜欢减少gulp任务数量的一件事是使用参数,但如果你愿意,你可以坚持使用inc函数,这是一个细节(这里是--major--minor--patch)。

所以你可以做这样的事情(在执行顺序中从上到下):

gulp.task('uprev', function () {
  return gulp.src(['./package.json', './bower.json'])
    .pipe(bump({ type: process.argv[3] ? process.argv[3].substr(2) : 'patch' }))
    .pipe(gulp.dest('./'));
});

gulp.task('rebuild', function (cb) {
  runSequence('uprev', 'js', cb); //uprev will here be executed before js
});

gulp.task('commit', ['rebuild'], function () {
    return gulp.src(['./package.json', './bower.json', 'dist/**/*'])
      .pipe(git.add())
      .pipe(git.commit('bump version'));
});

gulp.task('bump', ['commit'], function () {
  return gulp.src('package.json')
    .pipe(tagVersion());
});

对于您的提交,您可能希望同时添加清单和已编译的文件,我已添加随机dist文件夹的所有内容以进行演示。

我故意削减bumpcommit任务,因此您不必使用 gulp-filter ,这在我看来相当无用对于这种小事,但它当然是你想要的。

最后一件事(承诺),您可以通过使用简单的节点fs调用结合 gulp-git <来避免使用 gulp-tag-version / em>你已经拥有:

gulp.task('bump', ['commit'], function (cb) {
  fs.readFile('./package.json', function (err, data) {
    if (err) { return cb(err); }
    var version = JSON.parse(data.toString()).version;
    git.tag(version, 'Version message', function (err) {
      cb(err);
    });
});