Hello, I’ve made an alternative to goversioninfo. It has a little more features and allows proper multilingual VersionInfo.
It can be used as a library too, so you don’t need a temporary JSON file. If you want to try it, simply replace the shouldBuildSyso
function in build.go
with:
func shouldBuildSyso(dir string) (string, error) {
rs := winres.ResourceSet{}
info := vi.Info{}
info.SetFileVersion(version)
info.SetProductVersion(version)
info.Set(winres.LCIDDefault, vi.CompanyName, "The Syncthing Authors")
info.Set(winres.LCIDDefault, vi.FileDescription, "Syncthing - Open Source Continuous File Synchronization")
info.Set(winres.LCIDDefault, vi.FileVersion, version)
info.Set(winres.LCIDDefault, vi.InternalName, "syncthing")
info.Set(winres.LCIDDefault, vi.LegalCopyright, "The Syncthing Authors")
info.Set(winres.LCIDDefault, vi.OriginalFilename, "syncthing")
info.Set(winres.LCIDDefault, vi.ProductName, "Syncthing")
info.Set(winres.LCIDDefault, vi.ProductVersion, version)
rs.SetVersionInfo(info)
icon, err := loadICO("assets/logo.ico")
if err != nil {
return "", err
}
rs.SetIcon(winres.ID(1), icon)
sysoPath := filepath.Join(dir, "cmd", "syncthing", "resource.syso")
syso, err := os.Create(sysoPath)
if err != nil {
return "", err
}
defer syso.Close()
err = rs.WriteObject(syso, winres.Arch(goarch))
if err != nil {
return "", err
}
return sysoPath, nil
}
func loadICO(path string) (*winres.Icon, error) {
ico, err := os.Open("assets/logo.ico")
if err != nil {
return nil, err
}
defer ico.Close()
icon, err := winres.LoadICO(ico)
if err != nil {
return nil, errors.New("failed to load " + path + ": " + err.Error())
}
return icon, nil
}
If it works better for you, I might propose a PR.