- 新增 web 组件独立发布为 nex-web_<version>.tar.gz
- server 新增 arm64 架构、macOS universal、Windows arm64 产物
- desktop 新增 arm64 架构支持(Linux/Windows)
- Linux desktop 新增 AppImage、deb、rpm 安装包格式
- macOS desktop 新增 unsigned DMG 安装包
- 统一发布资产命名为 {component}_{version}_{platform}_{arch}.{ext}
- 新增 SHA256SUMS 校验和清单覆盖全部发布资产
- versionctl 新增 asset-name CLI 支持按参数生成资产文件名
- Makefile release target 重构为组件/平台/架构参数化
- GitHub Actions release workflow 扩展多组件多架构构建矩阵
- 同步更新 openspec 主规范(desktop-app/release-pipeline/workspace-command-flows)
158 lines
3.2 KiB
Go
158 lines
3.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"nex/versionctl/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 "bump":
|
|
if len(args) != 2 {
|
|
return fmt.Errorf("bump 需要一个参数: major|minor|patch 或具体版本号")
|
|
}
|
|
return runBump(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:])
|
|
case "release-assets-check":
|
|
if len(args) != 1 {
|
|
return fmt.Errorf("release-assets-check 不需要额外参数")
|
|
}
|
|
return projectversion.CheckReleaseAssets(root)
|
|
default:
|
|
return usageError()
|
|
}
|
|
}
|
|
|
|
func runBump(root, arg string) error {
|
|
newVersion, err := projectversion.Bump(root, arg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tags, err := projectversion.ListGitTags(root)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := projectversion.CheckNoRegression(newVersion, tags); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := projectversion.Sync(root); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := projectversion.Check(root); err != nil {
|
|
return err
|
|
}
|
|
|
|
fmt.Println(newVersion.String())
|
|
return nil
|
|
}
|
|
|
|
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) == 0 {
|
|
return fmt.Errorf("asset-name 需要组件参数: server|web|desktop")
|
|
}
|
|
|
|
version, err := projectversion.ReadString(root)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var platform, arch, format string
|
|
switch args[0] {
|
|
case "server", "desktop":
|
|
if len(args) != 4 {
|
|
return fmt.Errorf("%s 资产命名需要 platform、arch 和 format 参数", args[0])
|
|
}
|
|
platform = args[1]
|
|
arch = args[2]
|
|
format = args[3]
|
|
case "web":
|
|
if len(args) != 2 {
|
|
return fmt.Errorf("web 资产命名只需要 format 参数")
|
|
}
|
|
format = args[1]
|
|
default:
|
|
return fmt.Errorf("不支持的资产组件 %q", args[0])
|
|
}
|
|
|
|
name, nameErr := projectversion.ReleaseAssetName(version, args[0], platform, arch, format)
|
|
if nameErr != nil {
|
|
return nameErr
|
|
}
|
|
|
|
fmt.Println(name)
|
|
return nil
|
|
}
|
|
|
|
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("用法: version <print|sync|check|verify-tag|bump|macos-plist|asset-name|release-assets-check>")
|
|
}
|