дȫÏîĿÉó²éÎÊÌⲢ·¢²¼ v1.1.9
¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档 д Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£ Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£ Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢ Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£ Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
This commit is contained in:
@@ -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":
|
||||
|
||||
65
scripts/release/metadata.go
Normal file
65
scripts/release/metadata.go
Normal 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)
|
||||
}
|
||||
}
|
||||
43
scripts/release/metadata_test.go
Normal file
43
scripts/release/metadata_test.go
Normal 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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user