make.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #! /usr/bin/env python3
  2. """Сборка всей программы
  3. """
  4. import os
  5. import sys
  6. import datetime
  7. import subprocess
  8. import shutil
  9. def help() -> None:
  10. """Получить справку по сборке
  11. """
  12. h: str = """
  13. Справка по сборке:
  14. ./make.py help - Справка по сборке
  15. ./make.py build - Сборка всей программы"""
  16. print(h)
  17. class Pwa:
  18. """Класс сборки PWA
  19. """
  20. def __init__(self) -> None:
  21. pass
  22. def run(self) -> None:
  23. print('build PWA')
  24. os.chdir("../app_pwa")
  25. cmd: str = 'GOARCH=wasm ' +\
  26. 'GOOS=js ' +\
  27. 'go build -o ' +\
  28. '../app_work/bin/web/static/wasm/app.wasm ./cmd/client/main.go'
  29. os.system(cmd)
  30. class Build:
  31. """Класс сборки
  32. """
  33. def __init__(self) -> None:
  34. self.date_build: str = str(datetime.datetime.now())
  35. """Дата сборки"""
  36. self.date_build = self.date_build.replace(" ", "_")
  37. cmd: list[str] = ['git', 'describe', '--tags', '--abbrev=0']
  38. output: bytes = subprocess.Popen(
  39. cmd, stdout=subprocess.PIPE).communicate()[0]
  40. tag: str = output.decode("utf-8")
  41. tag = tag[:-1]
  42. self.tag: str = tag
  43. """Тег из гита"""
  44. cmd = ['go', 'version']
  45. output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0]
  46. go_version: str = output.decode("utf-8")
  47. go_version = go_version[11:][:-1].replace(" ", "_")
  48. out: str = f"date={self.date_build}\t\t" +\
  49. f"tag={self.tag}\t\t" +\
  50. f"go_version={go_version}"
  51. print(out)
  52. self.go_version: str = go_version
  53. """Версия golang"""
  54. def run(self) -> None:
  55. """Запуск сборки"""
  56. print("cleaning")
  57. try:
  58. shutil.rmtree('./bin')
  59. except OSError:
  60. pass
  61. try:
  62. os.mkdir("bin")
  63. except FileExistsError:
  64. pass
  65. try:
  66. os.mkdir("bin/web")
  67. except FileExistsError:
  68. pass
  69. try:
  70. os.mkdir("bin/web/static")
  71. except FileExistsError:
  72. pass
  73. try:
  74. os.mkdir("bin/web/tmpl")
  75. except FileExistsError:
  76. pass
  77. print("copying")
  78. os.system('cp -r ../app_serv/web ./bin')
  79. os.chdir("../app_serv")
  80. print("format")
  81. os.system("go fmt ./...")
  82. print("build")
  83. cmd: str = """go build -ldflags "-w -s -X """ +\
  84. f"""main.GoVersion={self.go_version} -X """ +\
  85. """main.Version=$TAG -X """ +\
  86. """main.Date=$BUILD_DATE" -o """ +\
  87. '../app_work/bin/server.exe ./cmd/server/main.go'
  88. print(cmd)
  89. os.system(cmd)
  90. os.chdir("../app_work")
  91. print('stripping')
  92. os.system('strip -s ./bin/server.exe')
  93. print('packing exe')
  94. os.system('upx -f ./bin/server.exe')
  95. exeSize: int = os.path.getsize("./bin/server.exe")
  96. print(f'size exe={exeSize/1000**2:.2f} MB')
  97. class Dev:
  98. """Класс разработки
  99. """
  100. def __init__(self) -> None:
  101. pass
  102. def run(self) -> None:
  103. print("cleaning")
  104. try:
  105. shutil.rmtree('./bin')
  106. except OSError:
  107. pass
  108. try:
  109. os.mkdir("bin")
  110. except FileExistsError:
  111. pass
  112. try:
  113. os.mkdir("bin/web")
  114. except FileExistsError:
  115. pass
  116. try:
  117. os.mkdir("bin/web/static")
  118. except FileExistsError:
  119. pass
  120. try:
  121. os.mkdir("bin/web/tmpl")
  122. except FileExistsError:
  123. pass
  124. print("copying")
  125. os.system('cp -r ../app_serv/web ./bin')
  126. os.chdir("../app_serv")
  127. print("format")
  128. os.system("go fmt ./...")
  129. print("build")
  130. cmd: str = """go build """ +\
  131. '-o ../app_work/bin/server.exe ./cmd/server/main.go'
  132. print(cmd)
  133. os.system(cmd)
  134. pwa: Pwa = Pwa()
  135. pwa.run()
  136. os.chdir("../app_work/bin")
  137. os.unsetenv('STAGE')
  138. os.putenv('STAGE', 'local')
  139. os.system('./server.exe')
  140. os.chdir('../..')
  141. if __name__ == '__main__':
  142. os.system('clear')
  143. args: list[str] = sys.argv
  144. if len(args) < 2:
  145. help()
  146. sys.exit(0)
  147. strCmd: str = args[1]
  148. match strCmd:
  149. case "help": # Получить справку по сборке
  150. help()
  151. case"build": # Сборка всей программы
  152. b: Build = Build()
  153. b.run()
  154. case "dev": # Разработка
  155. d: Dev = Dev()
  156. d.run()
  157. case "":
  158. help()
  159. case _: pass