Newer
Older
DungeonShooting / DungeonShooting_Godot / addons / dungeonShooting_plugin / generator / ExcelGenerator.cs
@小李xl 小李xl on 27 Feb 2024 5 KB 更新导出Excel表工具的提示
  1. #if TOOLS
  2.  
  3. using System;
  4. using System.IO;
  5. using System.Text.Json;
  6. using Config;
  7. using Godot;
  8. using Array = Godot.Collections.Array;
  9.  
  10. namespace Generator;
  11.  
  12. public static class ExcelGenerator
  13. {
  14. /// <summary>
  15. /// 执行导出Excel表
  16. /// </summary>
  17. public static bool ExportExcel()
  18. {
  19. var arr = new Array();
  20. var toolDir = "excelTool";
  21. var excelPath = "excel/";
  22. var jsonPath = "resource/config/";
  23. var codePath = "src/config/";
  24. //平台名称
  25. var osName = OS.GetName();
  26. //平台标识符
  27. string rid;
  28. string toolName;
  29. if (osName == "Windows")
  30. {
  31. rid = "win-x64";
  32. toolName = "ExcelTool.exe";
  33. }
  34. else if (osName == "macOS")
  35. {
  36. rid = "osx-x64";
  37. toolName = "ExcelTool";
  38. }
  39. else
  40. {
  41. GD.PrintErr($"当前平台{osName}不支持导出Excel表");
  42. return false;
  43. }
  44.  
  45. var toolPath = $"{toolDir}/publish/{rid}";
  46. if (!Directory.Exists(toolPath)) //判断是否编译过工具
  47. {
  48. GD.Print("开始编译导出工具");
  49. var r = compilerTool(toolDir, rid, toolPath);
  50. GD.Print("编译Excel工具返回值: " + r);
  51. if (r != 0)
  52. {
  53. if (osName == "macOS")
  54. {
  55. GD.Print("在Mac上自动编译Excel表失败, 不过您可以使用以上命令手动编译, 在项目根目录打开一个终端, 并执行以上命令");
  56. }
  57. return false;
  58. }
  59. }
  60. else if (File.ReadAllText($"{toolDir}/version") != File.ReadAllText($"{toolPath}/version")) //版本有变化
  61. {
  62. GD.Print("工具版本有变化,执行重新编译导出工具");
  63. //删除编译目录
  64. Directory.Delete(toolPath, true);
  65. var r = compilerTool(toolDir, rid, toolPath);
  66. GD.Print("编译Excel工具返回值: " + r);
  67. if (r != 0)
  68. {
  69. if (osName == "macOS")
  70. {
  71. GD.Print("在Mac上自动编译Excel表失败, 不过您可以使用以上命令手动编译, 在项目根目录打开一个终端, 并执行以上命令");
  72. }
  73. return false;
  74. }
  75. }
  76. var result = OS.Execute($"{toolPath}/{toolName}", new[] { excelPath, jsonPath, codePath }, arr);
  77. foreach (var message in arr)
  78. {
  79. GD.Print(message);
  80. }
  81. if (result != 0)
  82. {
  83. return false;
  84. }
  85. try
  86. {
  87. GeneratorActivityObjectInit();
  88. GD.Print("生成'src/framework/activity/ActivityObject_Init.cs'成功!");
  89. }
  90. catch (Exception e)
  91. {
  92. GD.PrintErr(e.ToString());
  93. return false;
  94. }
  95.  
  96. return true;
  97. }
  98.  
  99. //编译工具
  100. private static int compilerTool(string csProjectPath, string rid, string outputPath)
  101. {
  102. //dotnet publish excelTool -c Release -r win-x64 -o ./excelTool/publish/win-x64
  103. //dotnet publish excelTool -c Release -r osx-x64 -o excelTool/publish/osx-x64
  104. //dotnet publish excelTool -c Release -r osx-x64 --self-contained true -p:PublishSingleFile=true -o excelTool/publish/osx-x64
  105. GD.Print("编译命令: " + $"dotnet publish {csProjectPath} -c Release -r {rid} --self-contained true -p:PublishSingleFile=true -o {outputPath}");
  106. var outLog = new Array();
  107. var result = OS.Execute("dotnet", new string[]
  108. {
  109. "publish", csProjectPath,
  110. "-c", "Release", "-r", rid,
  111. "--self-contained", "true",
  112. "-p:PublishSingleFile=true",
  113. "-o", outputPath
  114. }, outLog);
  115. //var result = OS.Execute("dotnet", new string[] { "publish", csProjectPath, "-c", "Release", "-r", rid, "-o", outputPath }, outLog);
  116. foreach (var variant in outLog)
  117. {
  118. GD.Print(variant);
  119. }
  120.  
  121. return result;
  122. }
  123.  
  124. //生成初始化 ActivityObject 代码
  125. private static void GeneratorActivityObjectInit()
  126. {
  127. var text = File.ReadAllText($"resource/config/{nameof(ExcelConfig.ActivityBase)}.json");
  128. var array = JsonSerializer.Deserialize<System.Collections.Generic.Dictionary<string, object>[]>(text);
  129. var code1 = "";
  130.  
  131. foreach (var item in array)
  132. {
  133. var id = item["Id"];
  134. var name = item["Name"] + "";
  135. var intro = item["Intro"] + "";
  136. code1 += $" /// <summary>\n";
  137. code1 += $" /// 名称: {name} <br/>\n";
  138. code1 += $" /// 简介: {intro.Replace("\n", " <br/>\n /// ")}\n";
  139. code1 += $" /// </summary>\n";
  140. code1 += $" public const string Id_{id} = \"{id}\";\n";
  141. }
  142. var str = $"using Config;\n\n";
  143. str += $"// 根据配置表注册物体, 该类是自动生成的, 请不要手动编辑!\n";
  144. str += $"public partial class ActivityObject\n";
  145. str += $"{{\n";
  146. str += $" /// <summary>\n";
  147. str += $" /// 存放所有在表中注册的物体的id\n";
  148. str += $" /// </summary>\n";
  149. str += $" public static class Ids\n";
  150. str += $" {{\n";
  151. str += code1;
  152. str += $" }}\n";
  153. str += $"}}\n";
  154. File.WriteAllText("src/framework/activity/ActivityObject_Init.cs", str);
  155. }
  156. }
  157.  
  158. #endif