|
|
|
|
@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
|
|
|
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
|
using Volo.Abp.Cli.Args;
|
|
|
|
|
using Volo.Abp.Cli.Commands;
|
|
|
|
|
using Volo.Abp.Cli.Commands.Services;
|
|
|
|
|
using Volo.Abp.Cli.Http;
|
|
|
|
|
using Volo.Abp.Cli.ProjectBuilding;
|
|
|
|
|
using Volo.Abp.Cli.Utils;
|
|
|
|
|
@ -22,6 +23,8 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
{
|
|
|
|
|
public ILogger<ProjectNugetPackageAdder> Logger { get; set; }
|
|
|
|
|
public BundleCommand BundleCommand { get; }
|
|
|
|
|
public SourceCodeDownloadService SourceCodeDownloadService { get; }
|
|
|
|
|
public SolutionFileModifier SolutionFileModifier { get; }
|
|
|
|
|
|
|
|
|
|
protected IJsonSerializer JsonSerializer { get; }
|
|
|
|
|
protected ProjectNpmPackageAdder NpmPackageAdder { get; }
|
|
|
|
|
@ -38,7 +41,9 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
ModuleClassDependcyAdder moduleClassDependcyAdder,
|
|
|
|
|
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
|
|
|
|
|
BundleCommand bundleCommand,
|
|
|
|
|
CliHttpClientFactory cliHttpClientFactory)
|
|
|
|
|
CliHttpClientFactory cliHttpClientFactory,
|
|
|
|
|
SourceCodeDownloadService sourceCodeDownloadService,
|
|
|
|
|
SolutionFileModifier solutionFileModifier)
|
|
|
|
|
{
|
|
|
|
|
JsonSerializer = jsonSerializer;
|
|
|
|
|
NpmPackageAdder = npmPackageAdder;
|
|
|
|
|
@ -46,21 +51,151 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
ModuleClassDependcyAdder = moduleClassDependcyAdder;
|
|
|
|
|
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
|
|
|
|
|
BundleCommand = bundleCommand;
|
|
|
|
|
SourceCodeDownloadService = sourceCodeDownloadService;
|
|
|
|
|
SolutionFileModifier = solutionFileModifier;
|
|
|
|
|
_cliHttpClientFactory = cliHttpClientFactory;
|
|
|
|
|
Logger = NullLogger<ProjectNugetPackageAdder>.Instance;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task AddAsync(string projectFile, string packageName, string version = null)
|
|
|
|
|
public async Task AddAsync(
|
|
|
|
|
string projectFile,
|
|
|
|
|
string packageName,
|
|
|
|
|
string version = null,
|
|
|
|
|
bool useDotnetCliToInstall = true,
|
|
|
|
|
bool withSourceCode = false,
|
|
|
|
|
bool addSourceCodeToSolutionFile = false)
|
|
|
|
|
{
|
|
|
|
|
await AddAsync(
|
|
|
|
|
projectFile,
|
|
|
|
|
await FindNugetPackageInfoAsync(packageName),
|
|
|
|
|
version,
|
|
|
|
|
useDotnetCliToInstall,
|
|
|
|
|
withSourceCode,
|
|
|
|
|
addSourceCodeToSolutionFile
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task AddAsync(
|
|
|
|
|
string projectFile,
|
|
|
|
|
NugetPackageInfo package,
|
|
|
|
|
string version = null,
|
|
|
|
|
bool useDotnetCliToInstall = true,
|
|
|
|
|
bool withSourceCode = false,
|
|
|
|
|
bool addSourceCodeToSolutionFile = false)
|
|
|
|
|
{
|
|
|
|
|
await AddAsPackageReference(projectFile, package, version, useDotnetCliToInstall);
|
|
|
|
|
|
|
|
|
|
if (withSourceCode)
|
|
|
|
|
{
|
|
|
|
|
await AddSourceCode(projectFile, package, version);
|
|
|
|
|
await ConvertPackageReferenceToProjectReference(projectFile, package);
|
|
|
|
|
|
|
|
|
|
if (addSourceCodeToSolutionFile)
|
|
|
|
|
{
|
|
|
|
|
await SolutionFileModifier.AddPackageToSolutionFileAsync(package, FindSolutionFile(projectFile));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task ConvertPackageReferenceToProjectReference(string projectFile, NugetPackageInfo package)
|
|
|
|
|
{
|
|
|
|
|
var content = File.ReadAllText(projectFile);
|
|
|
|
|
var doc = new XmlDocument() {PreserveWhitespace = true};
|
|
|
|
|
|
|
|
|
|
doc.Load(StreamHelper.GenerateStreamFromString(content));
|
|
|
|
|
|
|
|
|
|
var nodes = doc.SelectNodes(
|
|
|
|
|
$"/Project/ItemGroup/PackageReference[starts-with(@Include, '{package.Name}')]");
|
|
|
|
|
|
|
|
|
|
if (nodes == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var downloadedProjectPath = FindRelativeFolderToDownloadPackage(projectFile, package);
|
|
|
|
|
var oldNodeIncludeValue = nodes[0]?.Attributes?["Include"]?.Value;
|
|
|
|
|
|
|
|
|
|
if (package.Name == oldNodeIncludeValue)
|
|
|
|
|
{
|
|
|
|
|
var referenceProjectPath = $"{downloadedProjectPath}\\{package.Name}.csproj";
|
|
|
|
|
|
|
|
|
|
var newNode = doc.CreateElement("ProjectReference");
|
|
|
|
|
var includeAttr = doc.CreateAttribute("Include");
|
|
|
|
|
includeAttr.Value = referenceProjectPath;
|
|
|
|
|
newNode.Attributes.Append(includeAttr);
|
|
|
|
|
|
|
|
|
|
nodes[0]?.ParentNode?.ReplaceChild(newNode, nodes[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
File.WriteAllText(projectFile, doc.OuterXml);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task AddSourceCode(string projectFile, NugetPackageInfo package, string version = null)
|
|
|
|
|
{
|
|
|
|
|
var targetFolder = FindFolderToDownloadPackage(projectFile, package);
|
|
|
|
|
|
|
|
|
|
if (Directory.Exists(targetFolder))
|
|
|
|
|
{
|
|
|
|
|
Directory.Delete(targetFolder, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await DownloadSourceCode(targetFolder, package, version);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string FindFolderToDownloadPackage(string projectFile, NugetPackageInfo package)
|
|
|
|
|
{
|
|
|
|
|
return Path.Combine(FindSolutionFolder(projectFile), "packages", package.Name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string FindRelativeFolderToDownloadPackage(string projectFile, NugetPackageInfo package)
|
|
|
|
|
{
|
|
|
|
|
var folder = Path.Combine(FindSolutionFolder(projectFile), "packages", package.Name);
|
|
|
|
|
|
|
|
|
|
return new Uri(projectFile).MakeRelativeUri(new Uri(folder)).ToString().Replace("/", "\\");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task DownloadSourceCode(string targetFolder, NugetPackageInfo package, string version = null)
|
|
|
|
|
{
|
|
|
|
|
await SourceCodeDownloadService.DownloadPackageAsync(
|
|
|
|
|
package.Name,
|
|
|
|
|
targetFolder,
|
|
|
|
|
version
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task AddAsync(string projectFile, NugetPackageInfo package, string version = null,
|
|
|
|
|
bool useDotnetCliToInstall = true)
|
|
|
|
|
private string FindSolutionFile(string projectFile)
|
|
|
|
|
{
|
|
|
|
|
var folder = FindSolutionFolder(projectFile);
|
|
|
|
|
|
|
|
|
|
return Directory.GetFiles(folder, "*.sln", SearchOption.TopDirectoryOnly).FirstOrDefault();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string FindSolutionFolder(string projectFile)
|
|
|
|
|
{
|
|
|
|
|
var targetFolder = Path.GetDirectoryName(projectFile);
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
if (Directory.GetParent(targetFolder) != null)
|
|
|
|
|
{
|
|
|
|
|
targetFolder = Directory.GetParent(targetFolder).FullName;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return Path.GetDirectoryName(projectFile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Directory.GetFiles(targetFolder, "*.sln", SearchOption.TopDirectoryOnly).Any())
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} while (targetFolder != null);
|
|
|
|
|
|
|
|
|
|
return targetFolder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task AddAsPackageReference(string projectFile, NugetPackageInfo package, string version,
|
|
|
|
|
bool useDotnetCliToInstall)
|
|
|
|
|
{
|
|
|
|
|
var projectFileContent = File.ReadAllText(projectFile);
|
|
|
|
|
|
|
|
|
|
@ -105,7 +240,9 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
ModuleClassDependcyAdder.Add(moduleFiles.First(), package.ModuleClass);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (useDotnetCliToInstall && (package.Target == NuGetPackageTarget.Blazor || package.Target == NuGetPackageTarget.BlazorServer || package.Target == NuGetPackageTarget.BlazorWebAssembly))
|
|
|
|
|
if (useDotnetCliToInstall && (package.Target == NuGetPackageTarget.Blazor ||
|
|
|
|
|
package.Target == NuGetPackageTarget.BlazorServer ||
|
|
|
|
|
package.Target == NuGetPackageTarget.BlazorWebAssembly))
|
|
|
|
|
{
|
|
|
|
|
await RunBundleForBlazorAsync(projectFile);
|
|
|
|
|
}
|
|
|
|
|
@ -125,7 +262,7 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
private Task AddToCsprojManuallyAsync(string projectFile, NugetPackageInfo package, string version = null)
|
|
|
|
|
{
|
|
|
|
|
var projectFileContent = File.ReadAllText(projectFile);
|
|
|
|
|
var doc = new XmlDocument() { PreserveWhitespace = true };
|
|
|
|
|
var doc = new XmlDocument() {PreserveWhitespace = true};
|
|
|
|
|
doc.Load(StreamHelper.GenerateStreamFromString(projectFileContent));
|
|
|
|
|
|
|
|
|
|
var itemGroupNodes = doc.SelectNodes("/Project/ItemGroup");
|
|
|
|
|
@ -166,7 +303,7 @@ namespace Volo.Abp.Cli.ProjectModification
|
|
|
|
|
|
|
|
|
|
private string GetAbpVersionOrNull(string projectFileContent)
|
|
|
|
|
{
|
|
|
|
|
var doc = new XmlDocument() { PreserveWhitespace = true };
|
|
|
|
|
var doc = new XmlDocument() {PreserveWhitespace = true};
|
|
|
|
|
|
|
|
|
|
doc.Load(StreamHelper.GenerateStreamFromString(projectFileContent));
|
|
|
|
|
|
|
|
|
|
|