mirror of https://github.com/abpframework/abp.git
2 changed files with 143 additions and 3 deletions
@ -0,0 +1,136 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using System.Xml; |
|||
using Volo.Abp.DependencyInjection; |
|||
|
|||
namespace Volo.Abp.Cli.ProjectModification |
|||
{ |
|||
public class NugetPackageToLocalReferenceConverter : ITransientDependency |
|||
{ |
|||
public async Task Convert(ModuleWithMastersInfo module, string solutionFile) |
|||
{ |
|||
var nugetPackageList = GetNugetPackages(module); |
|||
|
|||
var projectFilesUnderModules = GetProjectFilesUnder(Path.Combine(Path.GetDirectoryName(solutionFile), "modules")); ; |
|||
var projectFilesUnderSrc = GetProjectFilesUnder(Path.Combine(Path.GetDirectoryName(solutionFile), "src")); ; |
|||
var projectFilesUnderTest = GetProjectFilesUnder(Path.Combine(Path.GetDirectoryName(solutionFile), "test")); ; |
|||
|
|||
foreach (var projectFile in projectFilesUnderModules) |
|||
{ |
|||
ConvertToLocalReference(projectFile, nugetPackageList, "..\\..\\..\\"); |
|||
} |
|||
foreach (var projectFile in projectFilesUnderSrc) |
|||
{ |
|||
ConvertToLocalReference(projectFile, nugetPackageList, "..\\..\\modules\\"); |
|||
} |
|||
foreach (var projectFile in projectFilesUnderTest) |
|||
{ |
|||
ConvertToLocalReference(projectFile, nugetPackageList, "..\\..\\modules\\", "test"); |
|||
} |
|||
} |
|||
|
|||
private void ConvertToLocalReference(string projectFile, List<NugetPackageInfoWithModuleName> nugetPackageList, string localPathPrefix, string sourceFile = "src") |
|||
{ |
|||
var content = File.ReadAllText(projectFile); |
|||
var doc = new XmlDocument() { PreserveWhitespace = true }; |
|||
|
|||
doc.Load(GenerateStreamFromString(content)); |
|||
|
|||
var convertedProject = ProcessReferenceNodes(doc, nugetPackageList, localPathPrefix, sourceFile); |
|||
|
|||
File.WriteAllText(projectFile, convertedProject); |
|||
} |
|||
|
|||
|
|||
private string ProcessReferenceNodes(XmlDocument doc, List<NugetPackageInfoWithModuleName> nugetPackageList, string localPathPrefix, string sourceFile = "src") |
|||
{ |
|||
var nodes = doc.SelectNodes("/Project/ItemGroup/PackageReference[@Include]"); |
|||
|
|||
if (nodes == null) |
|||
{ |
|||
return doc.OuterXml; |
|||
} |
|||
|
|||
foreach (XmlNode oldNode in nodes) |
|||
{ |
|||
var oldNodeIncludeValue = oldNode?.Attributes?["Include"]?.Value; |
|||
|
|||
var nugetPackage = nugetPackageList.FirstOrDefault(n => n.NugetPackage.Name == oldNodeIncludeValue); |
|||
|
|||
if (nugetPackage == null) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var referenceProjectPath = |
|||
$"{localPathPrefix}{nugetPackage.ModuleName}\\{sourceFile}\\{nugetPackage.NugetPackage.Name}\\{nugetPackage.NugetPackage.Name}.csproj"; |
|||
|
|||
XmlNode newNode = GetNewReferenceNode(doc, referenceProjectPath); |
|||
|
|||
oldNode?.ParentNode?.ReplaceChild(newNode, oldNode); |
|||
} |
|||
|
|||
return doc.OuterXml; |
|||
} |
|||
|
|||
protected XmlElement GetNewReferenceNode(XmlDocument doc, string newValue) |
|||
{ |
|||
var newNode = doc.CreateElement("ProjectReference"); |
|||
|
|||
var includeAttr = doc.CreateAttribute("Include"); |
|||
includeAttr.Value = newValue; |
|||
newNode.Attributes.Append(includeAttr); |
|||
|
|||
return newNode; |
|||
} |
|||
|
|||
public List<NugetPackageInfoWithModuleName> GetNugetPackages(ModuleWithMastersInfo module) |
|||
{ |
|||
var list = new List<NugetPackageInfoWithModuleName>(); |
|||
|
|||
list.AddRange(module.NugetPackages.Select(n => new NugetPackageInfoWithModuleName |
|||
{ |
|||
ModuleName = module.Name, |
|||
NugetPackage = n |
|||
})); |
|||
|
|||
if (module.MasterModuleInfos != null) |
|||
{ |
|||
foreach (var masterModule in module.MasterModuleInfos) |
|||
{ |
|||
list.AddRange(GetNugetPackages(masterModule)); |
|||
} |
|||
} |
|||
|
|||
return list; |
|||
} |
|||
|
|||
private static string[] GetProjectFilesUnder(string path) |
|||
{ |
|||
return Directory.GetFiles(path, |
|||
"*.csproj", |
|||
SearchOption.AllDirectories); |
|||
} |
|||
|
|||
private static Stream GenerateStreamFromString(string s) |
|||
{ |
|||
var stream = new MemoryStream(); |
|||
var writer = new StreamWriter(stream); |
|||
writer.Write(s); |
|||
writer.Flush(); |
|||
stream.Position = 0; |
|||
return stream; |
|||
} |
|||
|
|||
public class NugetPackageInfoWithModuleName |
|||
{ |
|||
public NugetPackageInfo NugetPackage { get; set; } |
|||
|
|||
public string ModuleName { get; set; } |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue