¸ÄÓñ¾»ú¶ÀÁ¢ CA£¬»ָ´ CLI TLS УÑ飬±£»¤ƾ¾ÝÓëÅäÖò¢·¢±£´档 д Cursor Êý¾ݡ¢»Ự·¾¶¡¢´úÀíÉúÃüÖÜÆڡ¢ģÐÍÇëÇóÓë Skills Îļþ²Ù×÷¡£ Ϊ¶ÀÁ¢ Tab ·þÎñÔö¼ӿͻ§¶˼øȨ£¬Éý¼¶ÒÀÀµÓ빤¾ßÁ´£¬ÍêÉƷ¢²¼ԪÐÅϢͬ²½¡£ Ñé֤£ºÁ½¸ö Go ģ¿éµIJâÊÔ/vet¡¢¹ؼüģ¿é race¡¢ǰ¶˲âÊÔ/Éú²ú¹¹½¨/Éó¼ơ¢ Go ¿ɴï©¶´ɨÃèÓë macOS/Linux ¿ÉÐÐģ¿齻²æ±àÒë¾ùͨ¹ý¡£ Windows ¸ôÀëÆô¶¯ͨ¹ý£»δÍê³ɵĵã»÷ðÑ̺ÍԭÉúƽ̨Ñé֤¼ûÉó²鱨¸档
66 lines
2.1 KiB
Go
66 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|