|
@@ -0,0 +1,145 @@
|
|
|
|
|
+using System;
|
|
|
|
|
+using System.Collections.Generic;
|
|
|
|
|
+using System.IO;
|
|
|
|
|
+using System.Linq;
|
|
|
|
|
+using System.Text;
|
|
|
|
|
+using System.Xml.Linq;
|
|
|
|
|
+
|
|
|
|
|
+namespace SKMC.Api.Common.Version
|
|
|
|
|
+{
|
|
|
|
|
+ public static class VersionHelper
|
|
|
|
|
+ {
|
|
|
|
|
+ private static readonly RuntimeVersionProvider _provider = new RuntimeVersionProvider();
|
|
|
|
|
+ private static readonly Dictionary<string, ProjectVersion> projectsCacher = new Dictionary<string, ProjectVersion>();
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 获取当前工程/项目版本
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="rootDirectory"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public static ProjectVersion GetCurrentProjectVersion(string rootDirectory)
|
|
|
|
|
+ {
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ var gitRoot = _provider.FindGitRoot(rootDirectory);
|
|
|
|
|
+ if (string.IsNullOrEmpty(gitRoot))
|
|
|
|
|
+ {
|
|
|
|
|
+ return new ProjectVersion { ErrorMessage = "未找到Git仓库" };
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ var pro = GetFullProjectInfo(gitRoot);
|
|
|
|
|
+ projectsCacher.Add(pro.ProjectName, pro);
|
|
|
|
|
+ return pro;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception ex)
|
|
|
|
|
+ {
|
|
|
|
|
+ return new ProjectVersion { ErrorMessage = ex.Message };
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 获取整个项目的版本信息
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="rootPath"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public static ProjectVersion GetFullProjectInfo(string rootPath)
|
|
|
|
|
+ {
|
|
|
|
|
+ var project = _provider.GetProjectVersions(rootPath);
|
|
|
|
|
+ GetDependencyResolve(project);
|
|
|
|
|
+ return project;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //public static string GetMainGitVersion()
|
|
|
|
|
+ //{
|
|
|
|
|
+ // var p = GetCurrentProjectVersion();
|
|
|
|
|
+ // var hash = string.IsNullOrEmpty(p?.RootCommitHash)
|
|
|
|
|
+ // ? "unknown"
|
|
|
|
|
+ // : p.RootCommitHash.Substring(0, 7);
|
|
|
|
|
+
|
|
|
|
|
+ // return $"1.0.0.git{hash}";
|
|
|
|
|
+ //}
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 通过检索csproj文件,获取模块依赖信息
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="project"></param>
|
|
|
|
|
+ public static void GetDependencyResolve(ProjectVersion project)
|
|
|
|
|
+ {
|
|
|
|
|
+ var moduleMap = project.Modules.ToDictionary(m => m.Name.ToLower());
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var module in project.Modules)
|
|
|
|
|
+ {
|
|
|
|
|
+ var csproj = Directory.GetFiles(module.Path, "*.csproj").FirstOrDefault();
|
|
|
|
|
+ if (csproj == null) continue;
|
|
|
|
|
+
|
|
|
|
|
+ var doc = XDocument.Load(csproj);
|
|
|
|
|
+ XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
|
|
|
|
|
+
|
|
|
|
|
+ var refs = doc.Descendants(ns + "ProjectReference")
|
|
|
|
|
+ .Select(x => x.Attribute("Include")?.Value)
|
|
|
|
|
+ .Where(x => !string.IsNullOrEmpty(x))
|
|
|
|
|
+ .ToList();
|
|
|
|
|
+
|
|
|
|
|
+ List<string> depy = new List<string>();
|
|
|
|
|
+ List<string> depb = new List<string>();
|
|
|
|
|
+ foreach (var rel in refs)
|
|
|
|
|
+ {
|
|
|
|
|
+ var name = Path.GetFileNameWithoutExtension(rel).ToLower();
|
|
|
|
|
+ if (moduleMap.TryGetValue(name, out var dep))
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!module.Dependencies.Contains(dep.Name))
|
|
|
|
|
+ depy.Add(dep.Name);
|
|
|
|
|
+
|
|
|
|
|
+ if (!dep.DependedBy.Contains(module.Name))
|
|
|
|
|
+ depb.Add(module.Name);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ module.Dependencies = string.Join(",", depy);
|
|
|
|
|
+ module.DependedBy = string.Join(",", depb);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 模块合并
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ public static ProjectVersion ModuleMerge()
|
|
|
|
|
+ {
|
|
|
|
|
+ var project = new ProjectVersion
|
|
|
|
|
+ {
|
|
|
|
|
+ BuildTime = DateTime.Now
|
|
|
|
|
+ };
|
|
|
|
|
+ foreach (var proj in projectsCacher)
|
|
|
|
|
+ {
|
|
|
|
|
+ project.ProjectName += proj.Value.ProjectName + "/";
|
|
|
|
|
+ project.ErrorMessage += proj.Value.ErrorMessage;
|
|
|
|
|
+ project.Modules.AddRange(proj.Value.Modules);
|
|
|
|
|
+ }
|
|
|
|
|
+ return project;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// 生成文本
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="project"></param>
|
|
|
|
|
+ /// <returns></returns>
|
|
|
|
|
+ public static string GenerateText(ProjectVersion project)
|
|
|
|
|
+ {
|
|
|
|
|
+ var sb = new StringBuilder();
|
|
|
|
|
+ sb.AppendLine($"项目:{project.ProjectName}");
|
|
|
|
|
+ sb.AppendLine($"根版本:{project.RootCommitHash?.Substring(0, 7) ?? "unknown"}");
|
|
|
|
|
+ sb.AppendLine();
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var m in project.Modules)
|
|
|
|
|
+ {
|
|
|
|
|
+ sb.AppendLine($"模块:{m.Name}");
|
|
|
|
|
+ sb.AppendLine($"版本:{m.ShortVersion} {(m.HasUncommittedChanges ? "[未提交]" : "")}");
|
|
|
|
|
+ sb.AppendLine($"依赖:{string.Join(", ", m.Dependencies)}");
|
|
|
|
|
+ sb.AppendLine($"被依赖:{string.Join(", ", m.DependedBy)}");
|
|
|
|
|
+ sb.AppendLine($"DLL 文件版本:{m.AssemblyFileVersion}");
|
|
|
|
|
+ sb.AppendLine();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return sb.ToString();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|