Browse Source

Support angular template generation

pull/1557/head
Halil İbrahim Kalkan 7 years ago
parent
commit
ee4101e967
  1. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  2. 26
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  3. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoTemplateStore.cs
  4. 14
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseProvider.cs
  5. 16
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseProviderExtensions.cs
  6. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipeline.cs
  7. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipelineBuilder.cs
  8. 34
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/MoveFolderStep.cs
  9. 28
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFolderStep.cs
  10. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs
  11. 8
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs
  12. 9
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs
  13. 16
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFrameworkExtensions.cs
  14. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateStore.cs
  15. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs
  16. 38
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuilder.cs
  17. 57
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json

@ -153,6 +153,7 @@
"Code": "Code",
"Result": "Result",
"SeeTheDocumentForMoreInformation": "See the <a href=\"{1}\">{0} document</a> for more information",
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>"
"IndexPageHeroSection": "<span class=\"first-line shine\"><strong>open source</strong></span><span class=\"second-line text-uppercase\">Web Application<br />Framework </span><span class=\"third-line shine2\"><strong>for asp.net core</strong></span>",
"UiFramework": "UI Framework"
}
}

26
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -47,7 +47,8 @@ namespace Volo.Abp.Cli.Commands
SolutionName.Parse(commandLineArgs.Target),
commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long),
commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long),
GetDatabaseProviderOrNull(commandLineArgs),
GetDatabaseProvider(commandLineArgs),
GetUiFramework(commandLineArgs),
commandLineArgs.Options
)
);
@ -94,6 +95,7 @@ namespace Volo.Abp.Cli.Commands
{
StreamUtils.Copy(zipInputStream, streamWriter, buffer);
}
zipEntry = zipInputStream.GetNextEntry();
}
}
@ -138,7 +140,7 @@ namespace Volo.Abp.Cli.Commands
return "Generates a new solution based on the ABP startup templates.";
}
protected virtual DatabaseProvider GetDatabaseProviderOrNull(CommandLineArgs commandLineArgs)
protected virtual DatabaseProvider GetDatabaseProvider(CommandLineArgs commandLineArgs)
{
var optionValue = commandLineArgs.Options.GetOrNull(Options.DatabaseProvider.Short, Options.DatabaseProvider.Long);
switch (optionValue)
@ -152,6 +154,20 @@ namespace Volo.Abp.Cli.Commands
}
}
private UiFramework GetUiFramework(CommandLineArgs commandLineArgs)
{
var optionValue = commandLineArgs.Options.GetOrNull(Options.UiFramework.Short, Options.UiFramework.Long);
switch (optionValue)
{
case "mvc":
return UiFramework.Mvc;
case "angular":
return UiFramework.Angular;
default:
return UiFramework.NotSpecified;
}
}
public static class Options
{
public static class Template
@ -177,6 +193,12 @@ namespace Volo.Abp.Cli.Commands
public const string Short = "v";
public const string Long = "version";
}
public static class UiFramework
{
public const string Short = "u";
public const string Long = "ui";
}
}
}
}

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoTemplateStore.cs

@ -7,7 +7,6 @@ using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
using Volo.Abp.IO;
@ -40,8 +39,6 @@ namespace Volo.Abp.Cli.ProjectBuilding
public async Task<TemplateFile> GetAsync(
string name,
DatabaseProvider databaseProvider,
string projectName,
string version = null)
{
if (version == null)

14
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseProvider.cs

@ -6,18 +6,4 @@
EntityFrameworkCore = 1,
MongoDb = 2
}
public static class DatabaseProviderExtensions
{
public static string ToProviderName(this DatabaseProvider databaseProvider)
{
switch (databaseProvider)
{
case DatabaseProvider.EntityFrameworkCore: return "ef";
case DatabaseProvider.MongoDb: return "mongodb";
case DatabaseProvider.NotSpecified: return "NotSpecified";
default: return "NotSpecified";
}
}
}
}

16
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseProviderExtensions.cs

@ -0,0 +1,16 @@
namespace Volo.Abp.Cli.ProjectBuilding.Building
{
public static class DatabaseProviderExtensions
{
public static string ToProviderName(this DatabaseProvider databaseProvider)
{
switch (databaseProvider)
{
case DatabaseProvider.EntityFrameworkCore: return "ef";
case DatabaseProvider.MongoDb: return "mongodb";
case DatabaseProvider.NotSpecified: return "NotSpecified";
default: return "NotSpecified";
}
}
}
}

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipeline.cs

@ -4,18 +4,21 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
{
public class ProjectBuildPipeline
{
public ProjectBuildContext Context { get; }
public List<ProjectBuildPipelineStep> Steps { get; }
public ProjectBuildPipeline()
public ProjectBuildPipeline(ProjectBuildContext context)
{
Context = context;
Steps = new List<ProjectBuildPipelineStep>();
}
public void Execute(ProjectBuildContext context)
public void Execute()
{
foreach (var step in Steps)
{
step.Execute(context);
step.Execute(Context);
}
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildPipelineBuilder.cs

@ -6,7 +6,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
{
public static ProjectBuildPipeline Build(ProjectBuildContext context)
{
var pipeline = new ProjectBuildPipeline();
var pipeline = new ProjectBuildPipeline(context);
pipeline.Steps.Add(new FileEntryListReadStep());

34
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/MoveFolderStep.cs

@ -0,0 +1,34 @@
using System;
using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class MoveFolderStep : ProjectBuildPipelineStep
{
private readonly string _sourceFolder;
private readonly string _targetFolder;
public MoveFolderStep(string sourceFolder, string targetFolder)
{
_sourceFolder = sourceFolder;
_targetFolder = targetFolder;
}
public override void Execute(ProjectBuildContext context)
{
var fileEntries = context.Files.Where(file => file.Name.StartsWith(_sourceFolder)).ToList();
foreach (var fileEntry in fileEntries)
{
var newName = fileEntry.Name.ReplaceFirst(_sourceFolder, _targetFolder);
if (newName.IsIn("", "/"))
{
context.Files.Remove(fileEntry);
continue;
}
fileEntry.SetName(newName);
}
}
}
}

28
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveFolderStep.cs

@ -0,0 +1,28 @@
using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemoveFolderStep : ProjectBuildPipelineStep
{
private readonly string _folderPath;
public RemoveFolderStep(string folderPath)
{
_folderPath = folderPath;
}
public override void Execute(ProjectBuildContext context)
{
//Remove the folder content
var folderPathWithSlash = _folderPath + "/";
context.Files.RemoveAll(file => file.Name.StartsWith(folderPathWithSlash));
//Remove the folder
var folder = context.Files.FirstOrDefault(file => file.Name == _folderPath);
if (folder != null)
{
context.Files.Remove(folder);
}
}
}
}

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs

@ -24,9 +24,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
public override void Execute(ProjectBuildContext context)
{
var projectFolderWithSlash = _projectFolderPath + "/";
context.Files.RemoveAll(file => file.Name.StartsWith(projectFolderWithSlash));
context.Files.RemoveAll(file => file.Name == _projectFolderPath);
new RemoveFolderStep(_projectFolderPath).Execute(context);
var solutionFile = context.GetFile(_solutionFilePath);
solutionFile.NormalizeLineEndings();
solutionFile.SetLines(RemoveProject(solutionFile.GetLines().ToList()));

8
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs

@ -11,15 +11,19 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
public DatabaseProvider DefaultDatabaseProvider { get; }
public UiFramework DefaultUiFramework { get; }
[CanBeNull]
public string DocumentUrl { get; set; }
protected TemplateInfo(
[NotNull] string name,
DatabaseProvider defaultDatabaseProvider = DatabaseProvider.NotSpecified)
DatabaseProvider defaultDatabaseProvider = DatabaseProvider.NotSpecified,
UiFramework defaultUiFramework = UiFramework.NotSpecified)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name));
DefaultDatabaseProvider = Check.NotNull(defaultDatabaseProvider, nameof(defaultDatabaseProvider));
DefaultDatabaseProvider = defaultDatabaseProvider;
DefaultUiFramework = defaultUiFramework;
}
public virtual IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)

9
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFramework.cs

@ -0,0 +1,9 @@
namespace Volo.Abp.Cli.ProjectBuilding.Building
{
public enum UiFramework
{
NotSpecified = 0,
Mvc = 1,
Angular = 2
}
}

16
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/UiFrameworkExtensions.cs

@ -0,0 +1,16 @@
namespace Volo.Abp.Cli.ProjectBuilding.Building
{
public static class UiFrameworkExtensions
{
public static string ToFrameworkName(this UiFramework uiFramework)
{
switch (uiFramework)
{
case UiFramework.Mvc: return "mvc";
case UiFramework.Angular: return "angular";
case UiFramework.NotSpecified: return "NotSpecified";
default: return "NotSpecified";
}
}
}
}

3
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateStore.cs

@ -1,6 +1,5 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding
{
@ -8,8 +7,6 @@ namespace Volo.Abp.Cli.ProjectBuilding
{
Task<TemplateFile> GetAsync(
string name,
DatabaseProvider databaseProvider,
string projectName,
[CanBeNull] string version = null
);
}

4
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs

@ -17,6 +17,8 @@ namespace Volo.Abp.Cli.ProjectBuilding
public DatabaseProvider DatabaseProvider { get; set; }
public UiFramework UiFramework { get; set; }
[NotNull]
public Dictionary<string, string> ExtraProperties { get; set; }
@ -25,12 +27,14 @@ namespace Volo.Abp.Cli.ProjectBuilding
[CanBeNull] string templateName = null,
[CanBeNull] string version = null,
DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified,
UiFramework uiFramework = UiFramework.NotSpecified,
Dictionary<string, string> extraProperties = null)
{
SolutionName = Check.NotNull(solutionName, nameof(solutionName));
TemplateName = templateName;
Version = version;
DatabaseProvider = databaseProvider;
UiFramework = uiFramework;
ExtraProperties = extraProperties ?? new Dictionary<string, string>();
}
}

38
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuilder.cs

@ -41,20 +41,10 @@ namespace Volo.Abp.Cli.ProjectBuilding
{
var templateInfo = GetTemplateInfo(args);
args.TemplateName = templateInfo.Name;
if (args.DatabaseProvider == DatabaseProvider.NotSpecified)
{
if (templateInfo.DefaultDatabaseProvider != DatabaseProvider.NotSpecified)
{
args.DatabaseProvider = templateInfo.DefaultDatabaseProvider;
}
}
NormalizeArgs(args, templateInfo);
var templateFile = await TemplateStore.GetAsync(
args.TemplateName,
args.DatabaseProvider,
args.SolutionName.FullName,
args.Version
);
@ -64,7 +54,7 @@ namespace Volo.Abp.Cli.ProjectBuilding
args
);
ProjectBuildPipelineBuilder.Build(context).Execute(context);
ProjectBuildPipelineBuilder.Build(context).Execute();
if (!templateInfo.DocumentUrl.IsNullOrEmpty())
{
@ -94,6 +84,30 @@ namespace Volo.Abp.Cli.ProjectBuilding
return new ProjectBuildResult(context.Result.ZipContent, args.SolutionName.ProjectName);
}
private static void NormalizeArgs(ProjectBuildArgs args, TemplateInfo templateInfo)
{
if (args.TemplateName.IsNullOrEmpty())
{
args.TemplateName = templateInfo.Name;
}
if (args.DatabaseProvider == DatabaseProvider.NotSpecified)
{
if (templateInfo.DefaultDatabaseProvider != DatabaseProvider.NotSpecified)
{
args.DatabaseProvider = templateInfo.DefaultDatabaseProvider;
}
}
if (args.UiFramework == UiFramework.NotSpecified)
{
if (templateInfo.DefaultUiFramework != UiFramework.NotSpecified)
{
args.UiFramework = templateInfo.DefaultUiFramework;
}
}
}
private TemplateInfo GetTemplateInfo(ProjectBuildArgs args)
{
if (args.TemplateName.IsNullOrWhiteSpace())

57
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs

@ -12,7 +12,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
public const string TemplateName = "app";
public AppTemplate()
: base(TemplateName, DatabaseProvider.EntityFrameworkCore)
: base(TemplateName, DatabaseProvider.EntityFrameworkCore, UiFramework.Mvc)
{
DocumentUrl = "https://docs.abp.io/en/abp/latest/Startup-Templates/Application";
}
@ -24,11 +24,12 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
SwitchDatabaseProvider(context, steps);
DeleteUnrelatedProjects(context, steps);
RandomizeSslPorts(context, steps);
CleanupFolderHierarchy(context, steps);
return steps;
}
private static void SwitchDatabaseProvider(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
private static void SwitchDatabaseProvider(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.DatabaseProvider == DatabaseProvider.MongoDb)
{
@ -51,30 +52,56 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
private void DeleteUnrelatedProjects(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.Web.Host", "MyCompanyName.MyProjectName.Web"));
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep());
}
}
if (context.BuildArgs.UiFramework != UiFramework.Mvc)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.Web.Host", "MyCompanyName.MyProjectName.Web"));
}
else
if (context.BuildArgs.UiFramework != UiFramework.Angular)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep());
steps.Add(new RemoveFolderStep("/angular"));
}
}
private static void RandomizeSslPorts(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new TemplateRandomSslPortStep(new List<string>
steps.Add(new TemplateRandomSslPortStep(
new List<string>
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303"
}
)
);
}
private void CleanupFolderHierarchy(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.UiFramework == UiFramework.Mvc)
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303"
}));
steps.Add(new MoveFolderStep("/aspnet-core/", "/"));
}
}
}
}
Loading…
Cancel
Save