1
0
Files
nex/backend/cmd/versionctl/main.go
lanyuanxiaoyao a9972360c2 feat: 增加版本化构建与发布流程
引入 VERSION 作为统一版本源,避免前端、后端、桌面打包和发布资产之间的版本漂移。
新增 tag 驱动的 Draft Release 流程与版本化资产命名,使本地演进和 GitHub 发布共享同一套约束。
2026-04-28 14:20:27 +08:00

120 lines
2.4 KiB
Go

package main
import (
"fmt"
"os"
"nex/backend/pkg/projectversion"
)
func main() {
if err := run(os.Args[1:]); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func run(args []string) error {
if len(args) == 0 {
return usageError()
}
root, err := projectversion.FindRepoRoot(mustGetwd())
if err != nil {
return err
}
switch args[0] {
case "print":
version, readErr := projectversion.ReadString(root)
if readErr != nil {
return readErr
}
fmt.Println(version)
return nil
case "sync":
return projectversion.Sync(root)
case "check":
return projectversion.Check(root)
case "verify-tag":
if len(args) != 2 {
return fmt.Errorf("verify-tag 需要一个 tag 参数")
}
return projectversion.VerifyTag(root, args[1])
case "macos-plist":
if len(args) != 2 {
return fmt.Errorf("macos-plist 需要一个最低系统版本参数")
}
return printMacOSPlist(root, args[1])
case "asset-name":
return printAssetName(root, args[1:])
default:
return usageError()
}
}
func printMacOSPlist(root, minMacOSVersion string) error {
version, err := projectversion.ReadString(root)
if err != nil {
return err
}
plist, err := projectversion.DesktopInfoPlist(version, minMacOSVersion)
if err != nil {
return err
}
fmt.Print(plist)
return nil
}
func printAssetName(root string, args []string) error {
if len(args) < 2 {
return fmt.Errorf("asset-name 至少需要 kind 和 platform 参数")
}
version, err := projectversion.ReadString(root)
if err != nil {
return err
}
switch args[0] {
case "server":
if len(args) != 3 {
return fmt.Errorf("server 资产命名需要 platform 和 arch 参数")
}
name, nameErr := projectversion.ServerAssetName(version, args[1], args[2])
if nameErr != nil {
return nameErr
}
fmt.Println(name)
return nil
case "desktop":
if len(args) != 2 {
return fmt.Errorf("desktop 资产命名只需要 platform 参数")
}
name, nameErr := projectversion.DesktopAssetName(version, args[1])
if nameErr != nil {
return nameErr
}
fmt.Println(name)
return nil
default:
return fmt.Errorf("不支持的资产类型 %q", args[0])
}
}
func mustGetwd() string {
wd, err := os.Getwd()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
return wd
}
func usageError() error {
return fmt.Errorf("用法: versionctl <print|sync|check|verify-tag|macos-plist|asset-name>")
}