main.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "os"
  7. "os/exec"
  8. "strconv"
  9. )
  10. func main() {
  11. versionFile := "version"
  12. b, err := os.ReadFile(versionFile)
  13. if err != nil {
  14. if os.IsNotExist(err) {
  15. file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_CREATE, 0777)
  16. if err != nil {
  17. fmt.Printf("create file %s error: %v\n", versionFile, err)
  18. os.Exit(1)
  19. }
  20. defer file.Close()
  21. file.WriteString("v1.0.0") // 初始版本
  22. cmd := exec.Command("git", "add", versionFile)
  23. err = cmd.Run()
  24. if err != nil {
  25. fmt.Printf("git add %s error: %v\n", versionFile, err)
  26. os.Exit(1)
  27. }
  28. return // 正常返回
  29. } else {
  30. fmt.Printf("read file ./version error: %v\n", err)
  31. os.Exit(1)
  32. }
  33. }
  34. file, err := os.OpenFile(versionFile, os.O_RDWR|os.O_TRUNC, 0777)
  35. if err != nil {
  36. fmt.Println(err)
  37. return
  38. }
  39. defer file.Close()
  40. bs := bytes.Split(b, []byte{'.'})
  41. lb := bs[len(bs)-1]
  42. i, err := strconv.Atoi(string(lb))
  43. if err != nil {
  44. fmt.Println(err)
  45. return
  46. }
  47. bs[len(bs)-1] = []byte(fmt.Sprintf("%d", i+1))
  48. tb := bytes.Join(bs, []byte{'.'})
  49. _, err = file.Write(tb)
  50. if err != nil {
  51. fmt.Println("write new version error:", err)
  52. os.Exit(1)
  53. }
  54. cmd := exec.Command("git", "add", versionFile)
  55. err = cmd.Run()
  56. if err != nil {
  57. fmt.Printf("git add %s error: %v\n", versionFile, err)
  58. os.Exit(1)
  59. }
  60. fmt.Printf("from version %s to %s\n", string(b), string(tb))
  61. // Windows编译版本文件
  62. winVersionFile := "./versioninfo.json"
  63. _, err = os.Stat(winVersionFile)
  64. var exist bool
  65. if err != nil {
  66. if !os.IsNotExist(err) {
  67. fmt.Printf("stat file %s error: %v\n", winVersionFile, err)
  68. os.Exit(1)
  69. } else {
  70. fmt.Println("xxxxxxxxx 无 ", winVersionFile)
  71. return // 正常返回
  72. }
  73. } else {
  74. exist = true
  75. }
  76. if exist {
  77. winB, err := os.ReadFile(winVersionFile)
  78. if err != nil {
  79. fmt.Println("open ", winVersionFile, "error: ", err)
  80. os.Exit(1)
  81. }
  82. var winV windowsVersion
  83. err = json.Unmarshal(winB, &winV)
  84. if err != nil {
  85. fmt.Println("invalid format of Windows version info: ", err, string(winB))
  86. os.Exit(1)
  87. }
  88. winV.StringFileInfo.ProductVersion = string(tb)
  89. file1, _ := os.OpenFile(winVersionFile, os.O_RDWR|os.O_TRUNC, 0777)
  90. defer file1.Close()
  91. vb, _ := json.MarshalIndent(winV, "", " ")
  92. _, err = file1.Write(vb)
  93. if err != nil {
  94. fmt.Println("write new windows version error: ", err)
  95. os.Exit(1)
  96. }
  97. cmd2 := exec.Command("git", "add", winVersionFile)
  98. err = cmd2.Run()
  99. if err != nil {
  100. fmt.Printf("git add %s error: %v\n", winVersionFile, err)
  101. os.Exit(1)
  102. }
  103. }
  104. }
  105. type windowsVersion struct {
  106. FixedFileInfo struct {
  107. FileVersion struct {
  108. Major int
  109. Minor int
  110. Patch int
  111. Build int
  112. }
  113. ProductVersion struct {
  114. Major int
  115. Minor int
  116. Patch int
  117. Build int
  118. }
  119. FileFlagsMask string
  120. FileFlags string
  121. FileOS string
  122. FileType string
  123. FileSubType string
  124. }
  125. StringFileInfo struct {
  126. Comments string
  127. CompanyName string
  128. FileDescription string
  129. FileVersion string
  130. InternalName string
  131. LegalCopyright string
  132. LegalTrademarks string
  133. OriginalFilename string
  134. PrivateBuild string
  135. ProductName string
  136. ProductVersion string
  137. SpecialBuild string
  138. }
  139. VarFileInfo struct {
  140. Translation struct {
  141. LangID string
  142. CharsetID string
  143. }
  144. }
  145. IconPath string
  146. ManifestPath string
  147. }