import dayjs from 'dayjs' import { exec } from 'child_process' import semver from 'semver' import { readFileSync, writeFileSync } from 'fs' // 初始化数据 // const packageFile = './package.json' // const versionFile = './public/version.json' // 获取执行的参数 const args = process.argv.slice(2) // console.log(args) // 暂停使用,禁止自动打tag // switch (args[0]) { // case '--patch': // autoTagVersion('patch') // break // case '--minor': // autoTagVersion('minor') // break // case '--major': // autoTagVersion('major') // break // default: // autoTagVersion('patch') // break // } /** * 自动打标签 */ // autoTagVersion() /** * 撤销标签 */ // revertTag('v1.6.1') /** * 获取最近的标签 */ // getLatestVersion() /** * 写入json文件 * @param {*} version * @param {*} fileDirName */ function writeJson(version, fileDirName) { try { writeFileSync(fileDirName, JSON.stringify(version, null, 2), { flag: 'w+', encoding: 'utf-8' }) console.log(`-> 写入 ${fileDirName} 成功`) } catch (err) { console.error(`-> 写入 ${fileDirName} 失败: `) console.error(err) throw err } } /** * 获取最新的版本号 * @returns */ function getLatestVersion() { return new Promise((resolve, reject) => { return exec('git describe --abbrev=0 --tags', (err, stdout, stderr) => { if (err) { reject() console.error('获取版本号失败:', err) } else { console.log('最新版本号:', stdout) resolve(stdout.trim()) } }) }) } /** * 根据最新版本号来推荐下一个版本号 * @param {*} latestVersion * @returns */ function suggestNextVersion(latestVersion, type = 'patch') { const cleanVersion = semver.clean(latestVersion) if (cleanVersion) { return semver.inc(cleanVersion, type) // 或者 'minor' 或者 'major' 根据需要 } return '1.0.0' } /** * 打上新的版本号 tag * @param {*} version */ function createNewTag(version) { exec(`git tag -a ${version} -m "Release version ${version}" && git push origin ${version}`, (err) => { if (err) { return console.error(err) } console.log(`Tag ${version} 创建成功`) getLatestVersion() }) } /** * 撤销某一个版本号的打版本号操作 * @param {*} version */ function revertTag(version) { exec(`git tag -d ${version} && git push origin --delete ${version}`, (err) => { if (err) { console.error(err) } else { console.log(`Tag ${version} reverted successfully.`) } }) } // 主函数 function autoTagVersion(type = 'patch') { getLatestVersion().then((latestVersion) => { const nextVersion = 'v' + suggestNextVersion(latestVersion, type) // 设置tag createNewTag(nextVersion) }) } // // 主函数 // function autoTagVersion(type = 'patch') { // getLatestVersion().then((latestVersion) => { // const nextVersion = 'v' + suggestNextVersion(latestVersion, type) // const content = readFileSync(packageFile, 'utf-8') // const packageInfo = JSON.parse(content) // packageInfo['version'] = nextVersion // packageInfo['updateTime'] = dayjs().format('YYYY-MM-DD HH:mm:ss') // // 写入文件 // writeJson(packageInfo, packageFile) // writeJson( // { // version: nextVersion, // updateTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), // }, // versionFile // ) // // 提交代码 // exec(`git add . && git commit -m "setTag ${nextVersion}" && git push`, (err, stdout, stderr) => { // if (err) { // console.error('代码提交失败') // console.error(err) // return // } // // 设置tag // createNewTag(nextVersion) // }) // }) // }