你能用gruntjs记录git修订版吗?

时间:2012-10-29 22:40:56

标签: git gruntjs

我使用gruntjs和yeoman.io构建我的webapp。

我希望能够记录构建来自的git revision / commit / sha,以便我可以查看已部署的版本并仔细检查它的来源以及新版本的更改内容。

3 个答案:

答案 0 :(得分:13)

也不是Grunt专家,但这里是基于git describe的解决方案,我目前用于大型AngularJS应用程序。我们将主要版本存储在项目的package.json中。除此之外,我生成一个version.json文件,其中包含每个构建的修订和日期。客户端稍后可以访问此信息,以帮助测试人员和维护人员查看他们正在使用的应用程序的版本/版本。

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),

  'git-describe': {
    options: {
      prop: 'meta.revision'
    },
    me: {}
  },

  ...
});

grunt.registerTask('tag-revision', 'Tag the current build revision', function () {
  grunt.task.requires('git-describe');

  grunt.file.write('public/version.json', JSON.stringify({
    version: grunt.config('pkg.version'),
    revision: grunt.config('meta.revision'),
    date: grunt.template.today()
  }));
});

grunt.registerTask('version', ['git-describe', 'tag-revision']);

因此,通过在构建任务中包含版本任务,我们可以使用version.json文件标记每个构建。

答案 1 :(得分:6)

不是gruntjs专家,但也许您可以在构建步骤中添加对gruntjs-git-describe模块的调用,该模块将调用that task

module.exports = function( grunt ) {
  grunt.registerTask("describe", "Describes current git commit", function (prop) {
    var done = this.async();

    grunt.log.write("Describe current commit: ");

    grunt.util.spawn({
      cmd : "git",
      args : [ "describe", "--tags", "--always", "--long", "--dirty" ]
    }, function (err, result) {
      if (err) {
        grunt.log.error(err);
        return done(false);
      }

      grunt.config(prop || "meta.version", result);

      grunt.log.writeln(result.green);

      done(result);
    });
  });
};

使用git-describe是一种使用Git记录“版本号”的好方法,因为它是基于SHA1的(明确的id)。
查看有关该主题的更多信息:

答案 2 :(得分:3)

详细说明Lucas Pottersky对inukshuk答案的评论,用grunt-git-describe> = 2.2.0做同样事情的正确方法如下:

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),

  'git-describe': {
    options: {
    },
    me: {}
  },

  ...
});

grunt.registerTask('saveRevision', function() {
  grunt.event.once('git-describe', function (rev) {
    grunt.option('gitRevision', rev);
  });
  grunt.task.run('git-describe');
});

grunt.registerTask('tag-revision', 'Tag the current build revision', function () {
  grunt.task.requires('git-describe');

  grunt.file.write('public/version.json', JSON.stringify({
    version: grunt.config('pkg.version'),
    revision: grunt.option('gitRevision'),
    date: grunt.template.today()
  }));
});

grunt.registerTask('version', ['saveRevision', 'tag-revision']);