123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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'
- /**
- * 自动打标签
- */
- 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(`-> 写入 version.json 成功`)
- } catch (err) {
- console.log(`-> 写入 version.json 失败: `, err)
- throw err
- }
- }
- /**
- * 获取最新的版本号
- * @returns
- */
- function getLatestVersion() {
- return new Promise((resolve, reject) => {
- return exec('git describe --tags `git rev-list --tags --max-count=1`', (err, stdout, stderr) => {
- if (err) {
- reject()
- return console.error('获取版本号失败:', err)
- }
- console.log('最新版本号:', stdout)
- resolve(stdout.trim())
- })
- })
- }
- /**
- * 根据最新版本号来推荐下一个版本号
- * @param {*} latestVersion
- * @returns
- */
- function suggestNextVersion(latestVersion) {
- const cleanVersion = semver.clean(latestVersion)
- if (cleanVersion) {
- return semver.inc(cleanVersion, 'patch') // 或者 '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} created successfully.`)
- getLatestVersion()
- })
- }
- /**
- * 撤销某一个版本号的打版本号操作
- * @param {*} version
- */
- function revertTag(version) {
- exec(`git tag -d ${version}`, (err) => {
- if (err) {
- console.error(err)
- } else {
- console.log(`Tag ${version} reverted successfully.`)
- }
- })
- }
- // 主函数
- function autoTagVersion() {
- getLatestVersion().then((latestVersion) => {
- const nextVersion = 'v' + suggestNextVersion(latestVersion)
- 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) => {
- console.log(err, stdout, stderr)
- if (err) {
- return console.error('代码提交失败')
- }
- // 设置tag
- createNewTag(nextVersion)
- })
- })
- }
|