Ð޸´ȫÏîĿÉó²éÎÊÌⲢ·¢²¼ v1.1.9

¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档
Ð޸´ Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£
Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£

Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢
Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£
Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
This commit is contained in:
FuDie0915
2026-11-10 09:59:34 +08:00
parent db73cf5a39
commit 188225fae6
98 changed files with 3324 additions and 930 deletions

View File

@@ -50,10 +50,12 @@ var releaseAssets = []assetSpec{
func main() {
if len(os.Args) < 2 {
exitf("usage: go run ./scripts/release <version|notes|manifest> [flags]")
exitf("usage: go run ./scripts/release <version|notes|manifest|sync-metadata> [flags]")
}
switch os.Args[1] {
case "sync-metadata":
runMetadata(os.Args[2:])
case "version":
runVersion(os.Args[2:])
case "notes":

View File

@@ -0,0 +1,65 @@
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"regexp"
"strings"
)
type metadataRule struct{ path, pattern, version string }
// syncMetadata updates version fields only. Regenerating Wails build templates
// during a release used to overwrite customized platform packaging tasks.
func syncMetadata(root, version string) error {
if !regexp.MustCompile(`^[0-9]+\.[0-9]+\.[0-9]+(?:-[A-Za-z0-9.-]+)?$`).MatchString(version) {
return fmt.Errorf("invalid release version")
}
core := strings.SplitN(version, "-", 2)[0]
rules := []metadataRule{
{"build/windows/info.json", `("(?:file_version|product_version|FileVersion|ProductVersion)"\s*:\s*")[^"]*(")`, core},
{"build/windows/wails.exe.manifest", `(<assemblyIdentity[^>]*version=")[^"]*(")`, core + ".0"},
{"build/windows/nsis/wails_tools.nsh", `(!define INFO_PRODUCTVERSION ")[^"]*(")`, core},
{"build/darwin/Info.plist", `(<key>CFBundle(?:ShortVersionString|Version)</key>\s*<string>)[^<]*(</string>)`, version},
{"build/darwin/Info.dev.plist", `(<key>CFBundle(?:ShortVersionString|Version)</key>\s*<string>)[^<]*(</string>)`, version},
{"build/linux/nfpm/nfpm.yaml", `(?m)(^version:\s*")[^"]*(")`, version},
}
updates := make(map[string][]byte)
for _, rule := range rules {
file := filepath.Join(root, filepath.FromSlash(rule.path))
data, err := os.ReadFile(file)
if err != nil {
return err
}
pattern := regexp.MustCompile(rule.pattern)
if !pattern.Match(data) {
return fmt.Errorf("missing version field in %s", rule.path)
}
updates[file] = pattern.ReplaceAll(data, []byte("${1}"+rule.version+"${2}"))
}
for file, data := range updates {
info, err := os.Stat(file)
if err != nil {
return err
}
if err = os.WriteFile(file, data, info.Mode().Perm()); err != nil {
return err
}
}
return nil
}
func runMetadata(args []string) {
flags := flag.NewFlagSet("sync-metadata", flag.ExitOnError)
root := flags.String("root", ".", "project root")
_ = flags.Parse(args)
version, err := readVersion(filepath.Join(*root, "build", "config.yml"))
if err != nil {
exitErr(err)
}
if err = syncMetadata(*root, version); err != nil {
exitErr(err)
}
}

View File

@@ -0,0 +1,43 @@
package main
import (
"os"
"path/filepath"
"strings"
"testing"
)
func TestMetadataSyncPreservesCustomBuildFilesAndContent(t *testing.T) {
root := t.TempDir()
files := []string{"build/windows/info.json", "build/windows/wails.exe.manifest", "build/windows/nsis/wails_tools.nsh", "build/darwin/Info.plist", "build/darwin/Info.dev.plist", "build/linux/nfpm/nfpm.yaml"}
for _, file := range files {
data, err := os.ReadFile(filepath.Join("..", "..", filepath.FromSlash(file)))
if err != nil {
t.Fatal(err)
}
target := filepath.Join(root, filepath.FromSlash(file))
_ = os.MkdirAll(filepath.Dir(target), 0700)
if err = os.WriteFile(target, data, 0600); err != nil {
t.Fatal(err)
}
}
task := filepath.Join(root, "build", "windows", "Taskfile.yml")
_ = os.WriteFile(task, []byte("custom packaging must stay"), 0600)
if err := syncMetadata(root, "9.8.7"); err != nil {
t.Fatal(err)
}
for _, file := range files {
data, _ := os.ReadFile(filepath.Join(root, filepath.FromSlash(file)))
if !strings.Contains(string(data), "9.8.7") {
t.Fatalf("version not updated: %s", file)
}
}
data, _ := os.ReadFile(task)
if string(data) != "custom packaging must stay" {
t.Fatal("custom task overwritten")
}
data, _ = os.ReadFile(filepath.Join(root, "build", "windows", "info.json"))
if !strings.Contains(string(data), "Local-Cursor") {
t.Fatal("product metadata lost")
}
}