| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- 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();
- }
- }
- }
|