Răsfoiți Sursa

设置版本号脚本

黄中银 2 săptămâni în urmă
părinte
comite
3828d1dfb4
6 a modificat fișierele cu 303 adăugiri și 47 ștergeri
  1. 3 2
      package.json
  2. 154 0
      scripts/bump-version.mjs
  3. 11 43
      scripts/release.cjs
  4. 133 0
      set-version.bat
  5. 1 1
      src-tauri/Cargo.toml
  6. 1 1
      src-tauri/tauri.conf.json

+ 3 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "claude-ai-installer",
-  "version": "0.0.6",
+  "version": "0.0.2",
   "description": "Claude AI安装器 - Claude AI Installer",
   "type": "module",
   "scripts": {
@@ -17,7 +17,8 @@
     "lint": "eslint . --fix",
     "test": "vitest",
     "test:run": "vitest run",
-    "test:coverage": "vitest run --coverage"
+    "test:coverage": "vitest run --coverage",
+    "version:bump": "node scripts/bump-version.mjs"
   },
   "dependencies": {
     "@element-plus/icons-vue": "^2.3.1",

+ 154 - 0
scripts/bump-version.mjs

@@ -0,0 +1,154 @@
+#!/usr/bin/env node
+/**
+ * 跨平台版本号更新脚本
+ * Cross-platform version bump script
+ *
+ * 用法 / Usage:
+ *   node scripts/bump-version.mjs <version>
+ *   node scripts/bump-version.mjs 1.0.0
+ *   node scripts/bump-version.mjs patch       # 0.0.6 -> 0.0.7
+ *   node scripts/bump-version.mjs minor       # 0.0.6 -> 0.1.0
+ *   node scripts/bump-version.mjs major       # 0.0.6 -> 1.0.0
+ *   node scripts/bump-version.mjs patch --dry-run  # 只输出计算后的版本号
+ */
+
+import { readFileSync, writeFileSync } from 'fs'
+import { resolve, dirname } from 'path'
+import { fileURLToPath } from 'url'
+
+const __dirname = dirname(fileURLToPath(import.meta.url))
+const rootDir = resolve(__dirname, '..')
+
+// 需要更新版本号的文件
+const FILES = {
+  packageJson: resolve(rootDir, 'package.json'),
+  tauriConf: resolve(rootDir, 'src-tauri/tauri.conf.json'),
+  cargoToml: resolve(rootDir, 'src-tauri/Cargo.toml'),
+}
+
+/**
+ * 解析语义化版本号
+ */
+function parseVersion(version) {
+  const match = version.match(/^(\d+)\.(\d+)\.(\d+)$/)
+  if (!match) {
+    throw new Error(`无效的版本号格式: ${version}`)
+  }
+  return {
+    major: parseInt(match[1], 10),
+    minor: parseInt(match[2], 10),
+    patch: parseInt(match[3], 10),
+  }
+}
+
+/**
+ * 获取当前版本号
+ */
+function getCurrentVersion() {
+  const packageJson = JSON.parse(readFileSync(FILES.packageJson, 'utf-8'))
+  return packageJson.version
+}
+
+/**
+ * 计算新版本号
+ */
+function getNewVersion(input) {
+  const currentVersion = getCurrentVersion()
+  const current = parseVersion(currentVersion)
+
+  switch (input) {
+    case 'major':
+      return `${current.major + 1}.0.0`
+    case 'minor':
+      return `${current.major}.${current.minor + 1}.0`
+    case 'patch':
+      return `${current.major}.${current.minor}.${current.patch + 1}`
+    default:
+      // 验证输入是否为有效版本号
+      parseVersion(input)
+      return input
+  }
+}
+
+/**
+ * 更新 package.json
+ */
+function updatePackageJson(version) {
+  const content = JSON.parse(readFileSync(FILES.packageJson, 'utf-8'))
+  content.version = version
+  writeFileSync(FILES.packageJson, JSON.stringify(content, null, 2) + '\n', 'utf-8')
+  console.log(`✓ 已更新 package.json -> ${version}`)
+}
+
+/**
+ * 更新 tauri.conf.json
+ */
+function updateTauriConf(version) {
+  const content = JSON.parse(readFileSync(FILES.tauriConf, 'utf-8'))
+  content.version = version
+  writeFileSync(FILES.tauriConf, JSON.stringify(content, null, 2) + '\n', 'utf-8')
+  console.log(`✓ 已更新 src-tauri/tauri.conf.json -> ${version}`)
+}
+
+/**
+ * 更新 Cargo.toml
+ */
+function updateCargoToml(version) {
+  let content = readFileSync(FILES.cargoToml, 'utf-8')
+  // 匹配 [package] 部分下的 version 字段
+  content = content.replace(
+    /^(version\s*=\s*")[\d.]+(")/m,
+    `$1${version}$2`
+  )
+  writeFileSync(FILES.cargoToml, content, 'utf-8')
+  console.log(`✓ 已更新 src-tauri/Cargo.toml -> ${version}`)
+}
+
+/**
+ * 主函数
+ */
+function main() {
+  const args = process.argv.slice(2)
+  const dryRun = args.includes('--dry-run')
+  const versionArgs = args.filter((arg) => !arg.startsWith('--'))
+
+  if (versionArgs.length === 0) {
+    const currentVersion = getCurrentVersion()
+    console.log(`当前版本: ${currentVersion}`)
+    console.log('')
+    console.log('用法:')
+    console.log('  node scripts/bump-version.mjs <version>')
+    console.log('  node scripts/bump-version.mjs 1.0.0          # 设置指定版本')
+    console.log('  node scripts/bump-version.mjs patch          # 补丁版本 +1')
+    console.log('  node scripts/bump-version.mjs minor          # 次版本 +1')
+    console.log('  node scripts/bump-version.mjs major          # 主版本 +1')
+    console.log('  node scripts/bump-version.mjs patch --dry-run  # 只输出计算后的版本号')
+    process.exit(0)
+  }
+
+  const input = versionArgs[0]
+  const currentVersion = getCurrentVersion()
+  const newVersion = getNewVersion(input)
+
+  // --dry-run 模式:只输出计算后的版本号(供其他脚本调用)
+  if (dryRun) {
+    console.log(newVersion)
+    process.exit(0)
+  }
+
+  console.log(`版本更新: ${currentVersion} -> ${newVersion}`)
+  console.log('')
+
+  try {
+    updatePackageJson(newVersion)
+    updateTauriConf(newVersion)
+    updateCargoToml(newVersion)
+    console.log('')
+    console.log(`✓ 所有文件已更新到版本 ${newVersion}`)
+  } catch (error) {
+    console.error(`✗ 更新失败: ${error.message}`)
+    process.exit(1)
+  }
+}
+
+main()

+ 11 - 43
scripts/release.cjs

@@ -123,29 +123,18 @@ function writePackageJson(pkg) {
   fs.writeFileSync(packageJsonPath, JSON.stringify(pkg, null, 2) + '\n');
 }
 
-// 计算新版本号
+// 计算新版本号(调用 bump-version.mjs --dry-run)
 function calculateNewVersion(currentVersion, versionArg) {
   if (!versionArg) {
     return currentVersion;
   }
 
-  // 如果是具体版本号
-  if (/^\d+\.\d+\.\d+/.test(versionArg)) {
-    return versionArg;
-  }
-
-  const parts = currentVersion.split('.').map(Number);
-
-  switch (versionArg) {
-    case 'major':
-      return `${parts[0] + 1}.0.0`;
-    case 'minor':
-      return `${parts[0]}.${parts[1] + 1}.0`;
-    case 'patch':
-      return `${parts[0]}.${parts[1]}.${parts[2] + 1}`;
-    default:
-      throw new Error(`无效的版本参数: ${versionArg}`);
-  }
+  // 调用 bump-version.mjs --dry-run 获取计算后的版本号
+  const result = execSync(`node scripts/bump-version.mjs ${versionArg} --dry-run`, {
+    cwd: projectRoot,
+    encoding: 'utf-8',
+  });
+  return result.trim();
 }
 
 // 执行命令
@@ -166,38 +155,17 @@ function exec(command, options = {}) {
   }
 }
 
-// 更新版本号
+// 更新版本号(调用 bump-version.mjs 脚本)
 function updateVersion(newVersion, dryRun) {
   log.step(`更新版本号到 ${newVersion}...`);
 
   if (dryRun) {
-    log.info('[DRY RUN] 将更新 package.json 和 tauri.conf.json 版本号');
+    log.info('[DRY RUN] 将更新 package.json、tauri.conf.json 和 Cargo.toml 版本号');
     return;
   }
 
-  // 更新 package.json
-  const pkg = readPackageJson();
-  pkg.version = newVersion;
-  writePackageJson(pkg);
-  log.success(`package.json 版本号已更新: ${newVersion}`);
-
-  // 更新 tauri.conf.json
-  const tauriConfPath = path.join(projectRoot, 'src-tauri', 'tauri.conf.json');
-  if (fs.existsSync(tauriConfPath)) {
-    const tauriConf = JSON.parse(fs.readFileSync(tauriConfPath, 'utf-8'));
-    tauriConf.version = newVersion;
-    fs.writeFileSync(tauriConfPath, JSON.stringify(tauriConf, null, 2) + '\n');
-    log.success(`tauri.conf.json 版本号已更新: ${newVersion}`);
-  }
-
-  // 更新 Cargo.toml
-  const cargoTomlPath = path.join(projectRoot, 'src-tauri', 'Cargo.toml');
-  if (fs.existsSync(cargoTomlPath)) {
-    let cargoToml = fs.readFileSync(cargoTomlPath, 'utf-8');
-    cargoToml = cargoToml.replace(/^version = ".*"$/m, `version = "${newVersion}"`);
-    fs.writeFileSync(cargoTomlPath, cargoToml);
-    log.success(`Cargo.toml 版本号已更新: ${newVersion}`);
-  }
+  // 调用 bump-version.mjs 脚本统一更新所有版本号
+  exec(`node scripts/bump-version.mjs ${newVersion}`);
 }
 
 // 构建所有平台

+ 133 - 0
set-version.bat

@@ -0,0 +1,133 @@
+@echo off
+chcp 65001 >nul
+setlocal enabledelayedexpansion
+
+:: 切换到脚本所在目录(项目根目录)
+cd /d "%~dp0"
+
+echo.
+echo +--------------------------------------------+
+echo ^|         版本号设置工具                     ^|
+echo ^|         Version Bump Tool                  ^|
+echo +--------------------------------------------+
+echo.
+
+:: 获取当前版本号(从 package.json 读取)
+for /f "tokens=2 delims=:, " %%a in ('findstr /c:"\"version\"" package.json') do (
+    set "current_version=%%~a"
+    goto :got_version
+)
+:got_version
+
+echo 当前版本: %current_version%
+echo.
+echo 支持的输入格式:
+echo   - 具体版本号: 1.0.0, 2.1.3
+echo   - patch: 补丁版本 +1 (如 0.0.6 -^> 0.0.7)
+echo   - minor: 次版本 +1   (如 0.0.6 -^> 0.1.0)
+echo   - major: 主版本 +1   (如 0.0.6 -^> 1.0.0)
+echo.
+
+:input_loop
+set "version_input="
+set /p "version_input=请输入新版本号 (q 退出): "
+
+:: 检查是否退出
+if /i "%version_input%"=="q" goto exit_script
+if /i "%version_input%"=="quit" goto exit_script
+if /i "%version_input%"=="exit" goto exit_script
+
+:: 检查是否为空
+if "%version_input%"=="" (
+    echo [错误] 版本号不能为空,请重新输入
+    echo.
+    goto input_loop
+)
+
+:: 检查是否为 patch/minor/major
+if /i "%version_input%"=="patch" goto validate_version
+if /i "%version_input%"=="minor" goto validate_version
+if /i "%version_input%"=="major" goto validate_version
+
+:: 验证版本号格式 (x.y.z)
+echo %version_input%| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$" >nul
+if errorlevel 1 (
+    echo [错误] 无效的版本号格式,请输入 x.y.z 格式或 patch/minor/major
+    echo.
+    goto input_loop
+)
+
+:validate_version
+:: 调用 bump-version.mjs --dry-run 获取计算后的版本号
+for /f "delims=" %%i in ('node scripts/bump-version.mjs %version_input% --dry-run 2^>nul') do set "new_version=%%i"
+
+if "%new_version%"=="" (
+    echo [错误] 无法计算新版本号,请检查输入
+    echo.
+    goto input_loop
+)
+
+echo.
+echo +--------------------------------------------+
+echo ^|  版本变更预览                              ^|
+echo +--------------------------------------------+
+echo ^|  当前版本: %current_version%
+echo ^|  新版本:   %new_version%
+echo +--------------------------------------------+
+echo.
+
+:confirm_loop
+set "confirm="
+set /p "confirm=确认更新版本号? (y/n): "
+
+if /i "%confirm%"=="y" goto do_update
+if /i "%confirm%"=="yes" goto do_update
+if /i "%confirm%"=="n" goto cancel_update
+if /i "%confirm%"=="no" goto cancel_update
+
+echo [提示] 请输入 y 或 n
+goto confirm_loop
+
+:cancel_update
+echo.
+echo 已取消,请重新输入版本号
+echo.
+goto input_loop
+
+:do_update
+echo.
+echo 正在更新版本号...
+echo.
+node scripts/bump-version.mjs %version_input%
+
+if errorlevel 1 (
+    echo.
+    echo [错误] 版本号更新失败
+    pause
+    exit /b 1
+)
+
+:: 更新当前版本号变量
+set "current_version=%new_version%"
+
+echo.
+echo ============================================
+echo   版本号已成功更新到 %new_version%
+echo ============================================
+echo.
+
+:after_update_loop
+set "after_choice="
+set /p "after_choice=按 Enter 继续修改,输入 q 退出: "
+
+if "%after_choice%"=="" goto input_loop
+if /i "%after_choice%"=="q" goto exit_script
+if /i "%after_choice%"=="quit" goto exit_script
+if /i "%after_choice%"=="exit" goto exit_script
+
+goto input_loop
+
+:exit_script
+echo.
+echo 再见!
+exit /b 0

+ 1 - 1
src-tauri/Cargo.toml

@@ -1,6 +1,6 @@
 [package]
 name = "claude-ai-installer"
-version = "0.0.6"
+version = "0.0.2"
 description = "Claude AI安装器 - Claude AI Installer"
 authors = ["Claude AI"]
 edition = "2021"

+ 1 - 1
src-tauri/tauri.conf.json

@@ -1,7 +1,7 @@
 {
   "$schema": "https://schema.tauri.app/config/2",
   "productName": "Claude AI Installer",
-  "version": "0.0.6",
+  "version": "0.0.2",
   "identifier": "com.claude.ai.installer",
   "build": {
     "beforeDevCommand": "npm run dev:frontend",