|
@@ -0,0 +1,124 @@
|
|
|
+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) {
|
|
|
+ console.error('获取版本号失败:', err)
|
|
|
+ reject()
|
|
|
+ }
|
|
|
+ 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}"`, (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error(err)
|
|
|
+ } else {
|
|
|
+ getLatestVersion()
|
|
|
+ console.log(`Tag ${version} created successfully.`)
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 撤销某一个版本号的打版本号操作
|
|
|
+ * @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)
|
|
|
+ createNewTag(nextVersion)
|
|
|
+ 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 commit -m "setTag ${nextVersion}"`, (err, stdout, stderr) => {
|
|
|
+ console.log(err, stdout, stderr)
|
|
|
+ if (err) {
|
|
|
+ console.error('获取版本号失败:', err)
|
|
|
+ }
|
|
|
+ console.log('最新版本号:', stdout)
|
|
|
+ })
|
|
|
+}
|