|
@@ -0,0 +1,117 @@
|
|
|
|
+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), { 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);
|
|
|
|
+ });
|
|
|
|
+}
|