trs-tag
Version:
a tool for easy update package.version and create git tag / push git tag
192 lines (187 loc) • 8.6 kB
JavaScript
var shell = require('shelljs');
var fs = require('fs');
const fp = require('../lib/util/fileReplace');
fs.access("./package.json",function(err){
if(err && err.code == "ENOENT"){
console.log("未发现package.json文件,请尝试使用 npm init 命令创建")
} else {
var cbDataPackage = require('../lib/util/read-package-json.js');
if (!cbDataPackage.version) {
console.log('版本号未定义, 程序将退出');
shell.exit(1);
}
let version = cbDataPackage.version;
let cosmiconfig = require('cosmiconfig');
let explorer = cosmiconfig.cosmiconfig('trs-tag');
let config;
let tagPrefix;
let tagName;
let tagMessage
explorer.search().then( result => {
if (!result) {
shell.echo('对不起,没有trs-tag的配置文件, 请尝试使用gt init 命令生成配置文件');
return;
}
config = result.config;
const envs = config.envs;
const arg = require('arg');
const args = arg({
'--help': Boolean,
'--push': Boolean,
'--remote': String,
'--env': String,
'--msg': String,
'--ver': String,
'-s': Boolean,
'-h': '--help',
});
if (args['--help']) {
shell.echo(`
使用方法: gt tag --env=envType --msg=tagMessage --ver=version --push --remote=origin
envType: 环境类型,需要在配置文件中配置类型及相应tag前缀,默认为‘dev’
tagMessage:tag描述信息, 默认为tag名称
version: x.x.x:自定义tag版本号,如 1.1.1, 默认为package.json中的version字段值
--push: 是否推送远程,如不需要,可不传
origin: 推送到的远程仓库名称,默认值为 origin
`);
return;
}
if (config.beforeTag) {
console.log('执行beforeTag钩子');
let r =shell.exec(`${config.beforeTag}`);
if (r.stderr) {
console.log(r.stderr);
}
}
if(args['-s']) {
var inquirer = require('inquirer');
let envList = Object.keys(envs)
inquirer.prompt([ {
type: 'list',
name: 'env',
message: '请选择要打tag的环境',
choices: envList
}]).then((answers) => {
tagPrefix = envs[answers.env];
console.log('正在fetch远程仓库,请稍等...');
shell.exec(`git fetch`,{ silent:true});
let r = shell.exec(`git tag -l "${tagPrefix}*" --sort=-v:refname | head -n 1`, { silent: true });
if (!r.code && r.stdout) {
console.log(`${answers.env} 环境的上一个tag是:${r.stdout}`);
}
return inquirer.prompt([{
type: 'input',
name: 'version',
message: '请输入版本号',
default: version
}])
}).then((answers) => {
tagName = tagPrefix + answers.version;
if (config.versionFile.length) {
globalVersionReplace(config, tagName);
}
return inquirer.prompt([
{
type: 'input',
name: 'tagMessage',
message: '请输入tag描述信息',
default: tagPrefix + answers.version
}
]);
}).then((answers) => {
let r = shell.exec(`git tag | grep "${tagName}"`);
if (!r.code && r.stdout && r.stdout === tagName) {
return Promise.reject('该tag已经存在');
} else {
tagMessage = answers.tagMessage;
let cr = shell.exec(`git tag -a ${tagName} -m ${tagMessage}`,{ silent: true });
if (!cr.code) {
console.log(`成功创建tag: ${tagName}`);
if (config.afterTag) {
console.log('执行afterTag钩子');
const commend = config.afterTag.replace(/__VERSION__/,`'${tagName}'`);
let r = shell.exec(`${commend}`);
if (r.stderr) {
console.log(r.stderr);
}
}
return inquirer.prompt([{
type: 'confirm',
name: 'isPush',
message: '是否将tag推送到远程仓库?'
}]);
} else {
return Promise.reject('创建tag出错');
}
}
}).then((answers) => {
if (answers.isPush) {
return inquirer.prompt([{
type: 'input',
name: 'remote',
message: '请输入远程仓库名称',
default: 'origin'
}])
} else {
return Promise.reject('');
}
}).then((answers) => {
shell.exec(`git push ${answers.remote} ${tagName}`);
}).catch((err) => {
console.log(err);
});
} else {
let envKey = args['--env'] || 'dev';
tagPrefix = envs[envKey];
tagName = tagPrefix + version;
tagMessage = args['--msg'] || `${tagName}`;
if (config.versionFile.length) {
globalVersionReplace(config, tagName);
}
var r = shell.exec(`git tag -a ${tagName} -m ${tagMessage}`);
if (r.code === 0) {
console.log(`成功创建tag: ${tagName}`);
if (config.afterTag) {
console.log('执行afterTag钩子');
const commend = config.afterTag.replace(/__VERSION__/,`'${tagName}'`);
let r = shell.exec(`${commend}`);
if (r.stderr) {
console.log(r.stderr);
}
}
if (args['--push']){
let remoteRepo = args['--remote'] || 'origin';
shell.exec(`git push ${remoteRepo} ${tagName}`);
}
}
}
}, err => {
console.log('读取配置文件出错:');
console.log(err);
});
}
})
function _getPackageVersion() {
return cbDataPackage ? cbDataPackage.version : null;
}
/**
* [globalVersionReplace 全局版本号替换]
*
* @param {[type]} config [config description]
* @param {[type]} tagName [tagName description]
*
* @return {[type]} [return description]
*/
function globalVersionReplace(config, tagName) {
console.log('将替换以下文件中的全局版本号');
for(let i = 0; i < config.versionFile.length; i++) {
console.log('全局版本替换标识为:', config.versionFile[i].reg);
console.log('正在替换工程代码中的版本号,请稍等...');
// shell.sed('-i',config.versionFieldReg, tagName, config.versionFilePath);
fp.fileReplace(config.versionFile[i],tagName)
}
console.log('替换完毕,准备提交');
shell.exec(`git add .`, { silent: true});
shell.exec(`git commit -m "build: ${config.versionCommitMsg}"`, { silent: true});
console.log('提交完毕');
}