mirror of https://github.com/abpframework/abp.git
15 changed files with 243 additions and 117 deletions
@ -0,0 +1,10 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace Volo.Abp.Cli.ProjectModification |
||||
|
{ |
||||
|
[Flags] |
||||
|
public enum NpmApplicationType |
||||
|
{ |
||||
|
Mvc = 1 |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,133 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
|
||||
|
namespace Volo.Abp.Cli.ProjectModification |
||||
|
{ |
||||
|
public static class ProjectFinder |
||||
|
{ |
||||
|
public static string FindNuGetTargetProjectFile(string[] projectFiles, NuGetPackageTarget target) |
||||
|
{ |
||||
|
if (!projectFiles.Any()) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
var assemblyNames = GetAssemblyNames(projectFiles); |
||||
|
|
||||
|
switch (target) |
||||
|
{ |
||||
|
case NuGetPackageTarget.Web: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".Web"); |
||||
|
case NuGetPackageTarget.EntityFrameworkCore: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".EntityFrameworkCore"); |
||||
|
case NuGetPackageTarget.MongoDB: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".MongoDB"); |
||||
|
case NuGetPackageTarget.Application: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".Application") ?? |
||||
|
FindProjectEndsWith(projectFiles, assemblyNames, ".Web"); |
||||
|
case NuGetPackageTarget.ApplicationContracts: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".Application.Contracts"); |
||||
|
case NuGetPackageTarget.Domain: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".Domain") ?? |
||||
|
FindProjectEndsWith(projectFiles, assemblyNames, ".Application") ?? |
||||
|
FindProjectEndsWith(projectFiles, assemblyNames, ".Web"); |
||||
|
case NuGetPackageTarget.DomainShared: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".Domain.Shared"); |
||||
|
case NuGetPackageTarget.HttpApi: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".HttpApi"); |
||||
|
case NuGetPackageTarget.HttpApiClient: |
||||
|
return FindProjectEndsWith(projectFiles, assemblyNames, ".HttpApi.Client"); |
||||
|
default: |
||||
|
throw new ApplicationException($"{nameof(NuGetPackageTarget)}.{target} has not implemented!"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static string[] FindNpmTargetProjectFile(string[] projectFiles) |
||||
|
{ |
||||
|
if (!projectFiles.Any()) |
||||
|
{ |
||||
|
return Array.Empty<string>(); |
||||
|
} |
||||
|
|
||||
|
var assemblyNames = GetAssemblyNames(projectFiles); |
||||
|
|
||||
|
var projects = new List<string>(); |
||||
|
|
||||
|
var project = FindProjectEndsWith(projectFiles, assemblyNames, ".Web.Host"); |
||||
|
if (project != null) |
||||
|
{ |
||||
|
projects.Add(project); |
||||
|
} |
||||
|
|
||||
|
project = FindProjectEndsWith(projectFiles, assemblyNames, ".Host", ".HttpApi.Host"); |
||||
|
if (project != null) |
||||
|
{ |
||||
|
projects.Add(project); |
||||
|
} |
||||
|
|
||||
|
if (projects.Any()) |
||||
|
{ |
||||
|
return projects.ToArray(); |
||||
|
} |
||||
|
|
||||
|
project = FindProjectEndsWith(projectFiles, assemblyNames, ".Web"); |
||||
|
if (project != null) |
||||
|
{ |
||||
|
projects.Add(project); |
||||
|
} |
||||
|
|
||||
|
return projects.ToArray(); |
||||
|
} |
||||
|
|
||||
|
public static string[] GetProjectFiles(string solutionFile) |
||||
|
{ |
||||
|
var baseProjectFolder = GetBaseProjectFolder(solutionFile); |
||||
|
return Directory.GetFiles(baseProjectFolder, "*.csproj", SearchOption.AllDirectories); |
||||
|
} |
||||
|
|
||||
|
public static string[] GetAssemblyNames(string[] projectFiles) |
||||
|
{ |
||||
|
return projectFiles.Select(GetAssemblyName).ToArray(); |
||||
|
} |
||||
|
|
||||
|
public static string GetAssemblyName(string projectFile) |
||||
|
{ |
||||
|
return projectFile |
||||
|
.Substring(projectFile.LastIndexOf(Path.DirectorySeparatorChar) + 1) |
||||
|
.RemovePostFix(StringComparison.OrdinalIgnoreCase, ".csproj"); |
||||
|
} |
||||
|
|
||||
|
private static string FindProjectEndsWith( |
||||
|
string[] projectFiles, |
||||
|
string[] assemblyNames, |
||||
|
string postfix, |
||||
|
string excludePostfix = null) |
||||
|
{ |
||||
|
for (var i = 0; i < assemblyNames.Length; i++) |
||||
|
{ |
||||
|
var assemblyName = assemblyNames[i]; |
||||
|
if(assemblyName.EndsWith(postfix, StringComparison.OrdinalIgnoreCase) && |
||||
|
(excludePostfix == null || !assemblyName.EndsWith(excludePostfix))) |
||||
|
{ |
||||
|
return projectFiles[i]; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
private static string GetBaseProjectFolder(string solutionFile) |
||||
|
{ |
||||
|
var baseFolder = Path.GetDirectoryName(solutionFile); |
||||
|
var srcFolder = Path.Combine(baseFolder, "src"); |
||||
|
if (Directory.Exists(srcFolder)) |
||||
|
{ |
||||
|
baseFolder = srcFolder; |
||||
|
} |
||||
|
|
||||
|
return baseFolder; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
using System.IO; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.Cli.ProjectModification; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.Cli |
||||
|
{ |
||||
|
public class ProjectFinder_Tests |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void FindNpmTargetProjectFile_Tests() |
||||
|
{ |
||||
|
var npmTargets = ProjectFinder.FindNpmTargetProjectFile( |
||||
|
new [] |
||||
|
{ |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj"), |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Web.Host.csproj"), |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.HttpApi.Host.csproj"), |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Application.Contracts.csproj"), |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Application.csproj"), |
||||
|
GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.EntityFrameworkCore.csproj") |
||||
|
} |
||||
|
); |
||||
|
|
||||
|
npmTargets.ShouldContain(GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj")); |
||||
|
npmTargets.ShouldContain(GetNormalizedPath(@"c:\temp\project\folder\src\Acme.PhoneBook.Web.Host.csproj")); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void GetAssemblyName_Tests() |
||||
|
{ |
||||
|
var assemblyName = ProjectFinder.GetAssemblyName( |
||||
|
GetNormalizedPath( |
||||
|
@"c:\temp\project\folder\src\Acme.PhoneBook.Host.csproj" |
||||
|
) |
||||
|
); |
||||
|
|
||||
|
assemblyName.ShouldBe("Acme.PhoneBook.Host"); |
||||
|
} |
||||
|
|
||||
|
private static string GetNormalizedPath(string path) |
||||
|
{ |
||||
|
return path.Replace('\\', Path.DirectorySeparatorChar); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue