我有一个使用Grunt构建的AngularJS模块。该模块的版本在 package.json 文件中进行管理。
我需要做什么
我需要创建一个grunt任务来在需要时释放模块。这是这项任务必须做的:
到目前为止我发现了
grunt-bump允许我使用--setversion选项传递特定版本。但它无法对SVN进行更改,它只与GIT合作。
grunt-svn-bump允许我提交SVN,但我无法找到指定下一个版本的方法。它无法执行"标记"一部分。
grunt-svn-tag允许我标记SVN存储库上的文件。
你知道另一个可以适合的咕噜插件吗?任何帮助将不胜感激。
答案 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
现在我还没有测试过这种语法,但是我会尝试这样做。