使用Grunt在SVN上转储特定版本号

时间:2016-01-11 09:04:18

标签: angularjs svn gruntjs

我有一个使用Grunt构建的AngularJS模块。该模块的版本在 package.json 文件中进行管理。

我需要做什么

我需要创建一个grunt任务来在需要时释放模块。这是这项任务必须做的:

  1. 在SVN上执行当前模块文件的标记(必须是SVN,而不是GIT)。
  2. 将package.json中的版本升级到给定版本(例如,我将--version = X.Y.Z作为grunt任务的选项传递)。我不想要一个仅基于" patch"," minor"或者"专业"升级。
  3. package.json 文件上提交更改。
  4. 到目前为止我发现了

    grunt-bump允许我使用--setversion选项传递特定版本。但它无法对SVN进行更改,它只与GIT合作。

    grunt-svn-bump允许我提交SVN,但我无法找到指定下一个版本的方法。它无法执行"标记"一部分。

    grunt-svn-tag允许我标记SVN存储库上的文件。

    你知道另一个可以适合的咕噜插件吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我很无聊地寻找适合的现有任务,所以我最终根据grunt-bump和grunt-svn-bump的代码创建了它:

grunt.registerTask('custom_bump', 'Custom task for bumping version after a release', function(){
    var semver = require('semver');
    var shell = require('shelljs');

    function shellRun( cmd ){
        if (grunt.option('dryRun')) {
            grunt.log.writeln('Command (not running because of dryRun option): ' + cmd);
        } else {
            grunt.verbose.writeln('Running: ' + cmd);
            var result = shell.exec(cmd, {silent:true});
            if (result.code !== 0) {
                grunt.log.error('Error (' + result.code + ') ' + result.output);
            }
        }
    }

    // Options
    var options = this.options({
        filepath: 'package.json',
        commit: true,
        commitMessage : 'New version following a release'
    });

    // Recover the next version of the component
    var nextVersion = grunt.option('nextVersion');
    if( !nextVersion ){
        grunt.fatal( 'Next version is not defined.', 3 );
    }
    else if( !semver.valid( nextVersion ) ){
        grunt.warn( 'Next version is invalid.', 3 );
    }

    // Upgrade version into package.json
    var filepath = options.filepath;
    var file = grunt.file.readJSON( filepath );
    var currentVersion = file.version;
    if( semver.lte( nextVersion, currentVersion ) ){
        grunt.warn( 'Next version is lesser or equal than current version.' );
    }
    file.version = nextVersion;
    grunt.log.write( 'Bumping version in ' + filepath + ' from ' + currentVersion + ' to ' + nextVersion + '... ' );
    grunt.file.write( filepath, JSON.stringify( file, null, 2 ) );
    grunt.log.ok();

    // Commit the changed package.json file
    if( options.commit ){
        var message =
        grunt.log.write( 'Committing ' +  filepath + '... ' );
        shellRun( 'svn commit "' + filepath + '" -m "' + options.commitMessage + '"' );
        grunt.log.ok();
    }

    // Update the config for next tasks
    var configProperty = 'pkg';
    grunt.log.write( 'Updating version in ' + configProperty + ' config... ' );
    var config = grunt.config( configProperty );
    if( config ){
        config.version = nextVersion;
        grunt.config( configProperty, config );
        grunt.log.ok();
    } else {
        grunt.log.warn( "Cannot update pkg config !" );
    }

    grunt.log.ok( 'Version updated from ' +  currentVersion + ' to ' + nextVersion + '.' );
});

我的'发布'任务使用grunt-svn-tag和我的自定义凹凸任务。

grunt.initConfig({
    // ...
    svn_tag: {
      current: {
        options: {
          tag: '<%= pkg.name %>-<%= pkg.version %>'
        }
      }
    }
});

grunt.registerTask('release', [
  'svn_tag:current',
  'custom_bump'
]);

答案 1 :(得分:0)

小免责声明,我不使用SVN或Grunt,而是使用GIT和Gulp,因此我并不真正了解其中任何一种的语法。

话虽这么说,我不会把它放在grunt / gulp任务中,但我会创建一个NPM任务来运行一个小的shell脚本。 npm release X.Y.Z
shellscript可能包含这样的内容:

#!/usr/bin/env bash

VERSION=$2
echo "gulp bump $VERSION"
gulp bump $VERSION

echo "staging package.json"
git add package.json

echo "commit release"
git commit -m "release $VERSION"
git tag -a "$VERSION" -m "release $VERSION"
git push origin --tags

现在我还没有测试过这种语法,但是我会尝试这样做。