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 projectsCacher = new Dictionary(); /// /// 获取当前工程/项目版本 /// /// /// 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 }; } } /// /// 获取整个项目的版本信息 /// /// /// 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}"; //} /// /// 通过检索csproj文件,获取模块依赖信息 /// /// 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 depy = new List(); List depb = new List(); 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); } } /// /// 模块合并 /// 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; } /// /// 生成文本 /// /// /// 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.CommitTime.ToString("yyMMddHHmmss")}.{m.ShortVersion}"); sb.AppendLine($"依赖:{string.Join(", ", m.Dependencies)}"); sb.AppendLine($"被依赖:{string.Join(", ", m.DependedBy)}"); sb.AppendLine($"DLL 文件版本:{m.AssemblyFileVersion}"); sb.AppendLine($"Message:{m.CommitMessage}"); sb.AppendLine($"作者:{m.Author}"); sb.AppendLine(); } return sb.ToString(); } } }