VersionHelper.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Xml.Linq;
  7. namespace SKMC.Api.Common.Version
  8. {
  9. public static class VersionHelper
  10. {
  11. private static readonly RuntimeVersionProvider _provider = new RuntimeVersionProvider();
  12. private static readonly Dictionary<string, ProjectVersion> projectsCacher = new Dictionary<string, ProjectVersion>();
  13. /// <summary>
  14. /// 获取当前工程/项目版本
  15. /// </summary>
  16. /// <param name="rootDirectory"></param>
  17. /// <returns></returns>
  18. public static ProjectVersion GetCurrentProjectVersion(string rootDirectory)
  19. {
  20. try
  21. {
  22. var gitRoot = _provider.FindGitRoot(rootDirectory);
  23. if (string.IsNullOrEmpty(gitRoot))
  24. {
  25. return new ProjectVersion { ErrorMessage = "未找到Git仓库" };
  26. }
  27. else
  28. {
  29. var pro = GetFullProjectInfo(gitRoot);
  30. projectsCacher.Add(pro.ProjectName, pro);
  31. return pro;
  32. }
  33. }
  34. catch (Exception ex)
  35. {
  36. return new ProjectVersion { ErrorMessage = ex.Message };
  37. }
  38. }
  39. /// <summary>
  40. /// 获取整个项目的版本信息
  41. /// </summary>
  42. /// <param name="rootPath"></param>
  43. /// <returns></returns>
  44. public static ProjectVersion GetFullProjectInfo(string rootPath)
  45. {
  46. var project = _provider.GetProjectVersions(rootPath);
  47. GetDependencyResolve(project);
  48. return project;
  49. }
  50. //public static string GetMainGitVersion()
  51. //{
  52. // var p = GetCurrentProjectVersion();
  53. // var hash = string.IsNullOrEmpty(p?.RootCommitHash)
  54. // ? "unknown"
  55. // : p.RootCommitHash.Substring(0, 7);
  56. // return $"1.0.0.git{hash}";
  57. //}
  58. /// <summary>
  59. /// 通过检索csproj文件,获取模块依赖信息
  60. /// </summary>
  61. /// <param name="project"></param>
  62. public static void GetDependencyResolve(ProjectVersion project)
  63. {
  64. var moduleMap = project.Modules.ToDictionary(m => m.Name.ToLower());
  65. foreach (var module in project.Modules)
  66. {
  67. var csproj = Directory.GetFiles(module.Path, "*.csproj").FirstOrDefault();
  68. if (csproj == null) continue;
  69. var doc = XDocument.Load(csproj);
  70. XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
  71. var refs = doc.Descendants(ns + "ProjectReference")
  72. .Select(x => x.Attribute("Include")?.Value)
  73. .Where(x => !string.IsNullOrEmpty(x))
  74. .ToList();
  75. List<string> depy = new List<string>();
  76. List<string> depb = new List<string>();
  77. foreach (var rel in refs)
  78. {
  79. var name = Path.GetFileNameWithoutExtension(rel).ToLower();
  80. if (moduleMap.TryGetValue(name, out var dep))
  81. {
  82. if (!module.Dependencies.Contains(dep.Name))
  83. depy.Add(dep.Name);
  84. if (!dep.DependedBy.Contains(module.Name))
  85. depb.Add(module.Name);
  86. }
  87. }
  88. module.Dependencies = string.Join(",", depy);
  89. module.DependedBy = string.Join(",", depb);
  90. }
  91. }
  92. /// <summary>
  93. /// 模块合并
  94. /// </summary>
  95. public static ProjectVersion ModuleMerge()
  96. {
  97. var project = new ProjectVersion
  98. {
  99. BuildTime = DateTime.Now
  100. };
  101. foreach (var proj in projectsCacher)
  102. {
  103. project.ProjectName += proj.Value.ProjectName + "/";
  104. project.ErrorMessage += proj.Value.ErrorMessage;
  105. project.Modules.AddRange(proj.Value.Modules);
  106. }
  107. return project;
  108. }
  109. /// <summary>
  110. /// 生成文本
  111. /// </summary>
  112. /// <param name="project"></param>
  113. /// <returns></returns>
  114. public static string GenerateText(ProjectVersion project)
  115. {
  116. var sb = new StringBuilder();
  117. sb.AppendLine($"项目:{project.ProjectName}");
  118. sb.AppendLine($"根版本:{project.RootCommitHash?.Substring(0, 7) ?? "unknown"}");
  119. sb.AppendLine();
  120. foreach (var m in project.Modules)
  121. {
  122. sb.AppendLine($"模块:{m.Name}");
  123. sb.AppendLine($"版本:{m.ShortVersion} {(m.HasUncommittedChanges ? "[未提交]" : "")}");
  124. sb.AppendLine($"依赖:{string.Join(", ", m.Dependencies)}");
  125. sb.AppendLine($"被依赖:{string.Join(", ", m.DependedBy)}");
  126. sb.AppendLine($"DLL 文件版本:{m.AssemblyFileVersion}");
  127. sb.AppendLine();
  128. }
  129. return sb.ToString();
  130. }
  131. }
  132. }