完整获取旧模式依赖结构代码

完整代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using NuGet.ProjectModel;
  5 using NuGet.PackageManagement;
  6 using NuGet.Common;
  7 using NuGet.Packaging.Core;
  8 using NuGet.Protocol;
  9 using NuGet.Protocol.Core.Types;
 10 using NuGet.Versioning;
 11 using static NuGet.Frameworks.FrameworkConstants;
 12 using static NuGet.Protocol.Core.Types.Repository;
 13 using System.Threading;
 14 using System.Threading.Tasks;
 15 using NuGet.Test.Utility;
 16 using System.IO;
 17 using System.Text.RegularExpressions;
 18 using System.Xml.Linq;
 19 using System.Xml;
 20 using NuGet.Frameworks;
 21 
 22 namespace Test_Tools.获取直接依赖
 23 {
 24     class Get_Old_dependency_Async
 25     {
 26         public static string Project = @"D:\VS2017\WorkSpace\BUG\Exception\新旧模式\项目中新旧模式混杂\framework(旧0-》旧1-》新2-》旧3)";
 27         public static string Project_file_path = "D:\\VS2017\\WorkSpace\\BUG\\Exception\\新旧模式\\项目中新旧模式混杂\\framework(旧0-》旧1-》新2-》旧3)\\Test_1\\Test_1.csproj";
 28         public static async Task GetDependencyInfoForPackageIdentitiesAsync(string Project,string Project_file_path)
 29         {
 30             using (var pathContext = new SimpleTestPathContext())
 31             {
 32                 string Path_Resorece = Project + @"\packages";
 33                 //直接获取nupkg包这样的环境
 34                 var sourceReposistory = Factory.GetCoreV3(Path_Resorece);
 35                 //读取packages.config里面的信息
 36                 var installedList = new List<PackageIdentity>();
 37                 var Packages_config_path = Get_packages_config(Project_file_path);
 38                 var elements = Read_XML(Packages_config_path);
 39                 foreach (var element in elements)
 40                 {
 41                     var ele_name = element.Attribute("id").Value;
 42                     var ele_version = element.Attribute("version").Value;
 43                     installedList.Add(new PackageIdentity(ele_name, NuGetVersion.Parse(ele_version)));
 44                 }
 45                 //工作的流程——》把所有的依赖项都放到一起,制作出来一个环境,然后根据这些环境构建之间的依赖关系
 46                 // Act
 47                 var packageDependencyInfos = await PackageGraphAnalysisUtilities.GetDependencyInfoForPackageIdentitiesAsync(
 48                     packageIdentities: installedList,
 49                     nuGetFramework: Trans_framework(Project_file_path),//甚至可以判断出来平台的兼容性!!!!!!!
 50                     dependencyInfoResource: await sourceReposistory.GetResourceAsync<DependencyInfoResource>(),//从Resourse中返回资源
 51                     sourceCacheContext: new SourceCacheContext(),
 52                     includeUnresolved: true,
 53                     logger: NullLogger.Instance,
 54                     cancellationToken: CancellationToken.None
 55                     );
 56                 // Assert
 57                 var Tops_List = new List<PackageDependencyInfo>();
 58                 foreach (var package in packageDependencyInfos)
 59                 {
 60                     var packageIdentity = new PackageIdentity(package.Id, package.Version);
 61                     var packageDependencyInfo = new PackageDependencyInfo(packageIdentity, Enumerable.Empty<PackageDependency>());
 62                     if (package.Dependencies.Count() > 0)
 63                     {
 64                         var PackageDependency_ = package.Dependencies;
 65                         packageDependencyInfo = new PackageDependencyInfo(packageIdentity, PackageDependency_);
 66 
 67                     }
 68                     Tops_List.Add(packageDependencyInfo);
 69                 }
 70                 //通过依赖图构建全局关系
 71                 var packageWithDependants = PackageGraphAnalysisUtilities.GetPackagesWithDependants(Tops_List);
 72 
 73                 Console.WriteLine(Get_project_name(Project_file_path));
 74                 Console.WriteLine("targetFramework_start");
 75                 Console.WriteLine(Trans_framework(Project_file_path).ToString());
 76                 foreach (var package in packageWithDependants)
 77                 {
 78                     if (package.IsTopLevelPackage)
 79                     {
 80                         Console.WriteLine(package.Identity.Id + ">=" + package.Identity.Version);
 81 
 82                     }
 83                 }
 84                 Console.WriteLine("targetFramework_end");
 85             }
 86 
 87         }
 88         public static string Get_packages_config(string Project_file_path)
 89         {
 90             //Test_1 - 副本.csproj
 91             var Project_folder = Project_file_path.Split("\\").Where(x => Regex.IsMatch(x, @"\.csproj$")).Last();
 92             var pattern = @"(?<folder>.+?)\\" + Project_folder + @"$";
 93             var Project_Path = Regex.Matches(Project_file_path, pattern).First().Groups["folder"].ToString();
 94             var Packages_config = Project_Path + @"\packages.config";
 95             if (!File.Exists(Packages_config))
 96                 Packages_config = "";
 97             return Packages_config;
 98             //同时还需要读取他的项目引用
 99         }
100         public static string Get_project_name(string Project_file_path)
101         {
102             //Test_1 - 副本.csproj
103             var Project_folder = Project_file_path.Split("\\").Where(x => Regex.IsMatch(x, @"\.csproj$")).Last();
104             Project_folder = Project_folder.Replace(".csproj", "");
105             return Project_folder;
106             //同时还需要读取他的项目引用
107         }
108         public static XmlElement Get_Project_reference(string File_path)
109         {
110             XmlReaderSettings xs = new XmlReaderSettings();
111             xs.XmlResolver = null;
112             xs.ProhibitDtd = false;
113             XmlReader xr = XmlReader.Create(File_path, xs);
114             XmlDocument xmldoc = new XmlDocument();
115             xmldoc.Load(xr);
116             XmlNamespaceManager nameSpace = new XmlNamespaceManager(xmldoc.NameTable);
117             XElement xe = XElement.Load(File_path);
118             var xmlns_value = xe.Attribute("xmlns").Value;
119             nameSpace.AddNamespace("XMLNS", xmlns_value);
120             XmlElement resume = xmldoc.DocumentElement;
121             var Project_references = resume.SelectNodes("//XMLNS:ItemGroup/XMLNS:ProjectReference", nameSpace);
122             foreach (XmlElement element in Project_references)
123             {
124                 string id = element.GetElementsByTagName("Name")[0].InnerText;
125                 Console.WriteLine(id);
126             }
127             return null;
128         }
129 
130         public static IEnumerable<XElement> Read_XML(string File_path)
131         {
132             XElement xe = XElement.Load(File_path);
133             var elements = from ele in xe.Elements()
134                            select ele;
135             return elements;
136         }
137         //目前还是无法获得当前的框架!!!!!!!
138         public static NuGetFramework Trans_framework(string File_path)
139         {
140             XmlReaderSettings xs = new XmlReaderSettings();
141             xs.XmlResolver = null;
142             xs.ProhibitDtd = false;
143             XmlReader xr = XmlReader.Create(File_path, xs);
144             XmlDocument xmldoc = new XmlDocument();
145             xmldoc.Load(xr);
146             XmlNamespaceManager nameSpace = new XmlNamespaceManager(xmldoc.NameTable);
147             XElement xe = XElement.Load(File_path);
148             var xmlns_value = xe.Attribute("xmlns").Value;
149             nameSpace.AddNamespace("XMLNS", xmlns_value);
150             XmlElement resume = xmldoc.DocumentElement;
151             var Project_references = resume.SelectNodes("//XMLNS:PropertyGroup/XMLNS:TargetFrameworkVersion", nameSpace);
152             Console.WriteLine(Project_references.Count);
153             var Versions = "";
154             foreach (XmlElement element in Project_references)
155             {
156                 Versions = element.InnerText;
157             }
158 
159             var Fram_Type = ".NETFramework";
160             var Fram_version = Versions.Split("v").Last();
161             var Fram_version_list = Fram_version.Split(".");
162             int major = 0;
163             int minor = 0;
164             int build = 0;
165             int revision = 0;
166             int nnum = 0;
167             foreach (var version in Fram_version_list)
168             {
169                 switch (nnum)
170                 {
171                     case 0:
172                         major = int.Parse(version);
173                         break;
174                     case 1:
175                         minor = int.Parse(version);
176                         break;
177                     case 2:
178                         build = int.Parse(version);
179                         break;
180                     case 3:
181                         revision = int.Parse(version);
182                         break;
183                     default: break;
184                 }
185                 nnum++;
186             }
187             return new NuGetFramework(Fram_Type, new Version(major, minor, build, revision));
188         }
189        
190 
191     }
192 }

 

posted @ 2022-03-27 21:27  博二爷  阅读(31)  评论(0编辑  收藏  举报