Browse Source

Revised MVC template generation code for new template structure.

pull/1148/head
Halil ibrahim Kalkan 7 years ago
parent
commit
644f206af6
  1. 3
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  2. 80
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SwitchEntityFrameworkCoreToMongoDbStep.cs
  3. 13
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs
  4. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs
  5. 47
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/MvcTemplate.cs
  6. 173
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/SwitchEntityFrameworkCoreToMongoDbStep.cs

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

@ -52,8 +52,9 @@ namespace Volo.Abp.Cli.Commands
var result = await ProjectBuilder.BuildAsync(
new ProjectBuildArgs(
SolutionName.Parse(commandLineArgs.Target),
commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long),
GetDatabaseProviderOrNull(commandLineArgs),
commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long)
commandLineArgs.Options
)
);

80
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SwitchEntityFrameworkCoreToMongoDbStep.cs

@ -1,80 +0,0 @@
using System;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class SwitchEntityFrameworkCoreToMongoDbStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
ChangeProjectReference(context);
ChangeWebModuleUsage(context);
ChangeConnectionString(context);
}
private void ChangeProjectReference(ProjectBuildContext context)
{
var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj");
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("ProjectReference") && lines[i].Contains("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations"))
{
lines[i] = lines[i].Replace("EntityFrameworkCore.DbMigrations", "MongoDB");
file.SetLines(lines);
return;
}
}
throw new ApplicationException("Could not find the EntityFrameworkCore reference in the MyCompanyName.MyProjectName.Web.csproj!");
}
private void ChangeWebModuleUsage(ProjectBuildContext context)
{
var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs");
file.NormalizeLineEndings();
file.RemoveTemplateCodeIfNot("EntityFrameworkCore");
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("using MyCompanyName.MyProjectName.EntityFrameworkCore"))
{
lines[i] = "using MyCompanyName.MyProjectName.MongoDb;";
}
else if (lines[i].Contains("MyProjectNameEntityFrameworkCoreModule"))
{
lines[i] = lines[i].Replace("MyProjectNameEntityFrameworkCoreModule", "MyProjectNameMongoDbModule");
}
}
file.SetLines(lines);
}
private void ChangeConnectionString(ProjectBuildContext context)
{
var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/appsettings.json");
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("Default") && lines[i].Contains("Database"))
{
lines[i] = " \"Default\": \"mongodb://localhost:27017|MyProjectName\"";
file.SetLines(lines);
return;
}
}
throw new ApplicationException("Could not find the 'Default' connection string in appsettings.json file!");
}
}
}

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

@ -1,4 +1,5 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding
@ -13,14 +14,20 @@ namespace Volo.Abp.Cli.ProjectBuilding
public DatabaseProvider DatabaseProvider { get; set; }
[NotNull]
public Dictionary<string, string> ExtraProperties { get; set; }
public ProjectBuildArgs(
[NotNull] SolutionName solutionName,
DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified,
[CanBeNull] string templateName = null)
[CanBeNull] string templateName = null,
DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified,
Dictionary<string, string> extraProperties = null)
{
DatabaseProvider = databaseProvider;
TemplateName = templateName;
SolutionName = Check.NotNull(solutionName, nameof(solutionName));
ExtraProperties = extraProperties ?? new Dictionary<string, string>();
}
}
}

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs

@ -1,6 +1,7 @@
using System;
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates;
using Volo.Abp.Cli.ProjectBuilding.Templates.Mvc;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.ProjectBuilding

47
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/MvcTemplate.cs → framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/MvcTemplate.cs

@ -2,7 +2,7 @@
using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
namespace Volo.Abp.Cli.ProjectBuilding.Templates
namespace Volo.Abp.Cli.ProjectBuilding.Templates.Mvc
{
public class MvcTemplate : TemplateInfo
{
@ -14,14 +14,17 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates
public MvcTemplate()
: base(TemplateName, DatabaseProvider.EntityFrameworkCore)
{
}
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
{
var steps = new List<ProjectBuildPipelineStep>();
SwitchDatabaseProvider(context, steps);
RemoveOtherDatabaseProviders(context, steps);
DeleteUnrelatedProjects(context, steps);
ChangeLocalhostPort(steps);
return steps;
}
@ -31,33 +34,49 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates
{
steps.Add(new SwitchEntityFrameworkCoreToMongoDbStep());
}
}
private static void RemoveOtherDatabaseProviders(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.EntityFrameworkCore)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Application.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Application.Tests"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Web.Tests"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests"));
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb)
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.MongoDB.Tests"));
}
}
private void DeleteUnrelatedProjects(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Web.Tests"));
//TODO: Rename Web.Host to Web
//TODO: Rename HttpApi.Host to HttpApi
}
else
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
}
}
private void ChangeLocalhostPort(List<ProjectBuildPipelineStep> steps)
{
steps.Add(
new ChangeLocalhostPortStep(
"/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json",
53929,
53932
)
);
//Disabled this since port change is complext and should be re-considered later
//steps.Add(
// new ChangeLocalhostPortStep(
// "/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json",
// 53929,
// 53932
// )
//);
}
}
}

173
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/SwitchEntityFrameworkCoreToMongoDbStep.cs

@ -0,0 +1,173 @@
using System;
using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.Mvc
{
public class SwitchEntityFrameworkCoreToMongoDbStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
//MyCompanyName.MyProjectName.Web
ChangeProjectReference(
context,
"/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj",
"EntityFrameworkCore.DbMigrations",
"MongoDB"
);
ChangeModuleDependency(
context,
"/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs",
"MyCompanyName.MyProjectName.EntityFrameworkCore",
"MyCompanyName.MyProjectName.MongoDb",
"MyProjectNameEntityFrameworkCoreModule",
"MyProjectNameMongoDbModule"
);
ChangeConnectionStringToMongoDb(
context,
"/src/MyCompanyName.MyProjectName.Web/appsettings.json"
);
//MyCompanyName.MyProjectName.IdentityServer
ChangeProjectReference(
context,
"/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj",
"EntityFrameworkCore.DbMigrations",
"MongoDB"
);
ChangeModuleDependency(
context,
"/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs",
"MyCompanyName.MyProjectName.EntityFrameworkCore",
"MyCompanyName.MyProjectName.MongoDb",
"MyProjectNameEntityFrameworkCoreModule",
"MyProjectNameMongoDbModule"
);
ChangeConnectionStringToMongoDb(
context,
"/src/MyCompanyName.MyProjectName.IdentityServer/appsettings.json"
);
//MyCompanyName.MyProjectName.HttpApi.Host
ChangeProjectReference(
context,
"/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj",
"EntityFrameworkCore.DbMigrations",
"MongoDB"
);
ChangeModuleDependency(
context,
"/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs",
"MyCompanyName.MyProjectName.EntityFrameworkCore",
"MyCompanyName.MyProjectName.MongoDb",
"MyProjectNameEntityFrameworkCoreModule",
"MyProjectNameMongoDbModule"
);
ChangeConnectionStringToMongoDb(
context,
"/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json"
);
//MyCompanyName.MyProjectName.Domain.Tests
ChangeProjectReference(
context,
"/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj",
"EntityFrameworkCore.Tests",
"MongoDB.Tests"
);
ChangeModuleDependency(
context,
"/src/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs",
"MyCompanyName.MyProjectName.EntityFrameworkCore",
"MyCompanyName.MyProjectName.MongoDb",
"MyProjectNameEntityFrameworkCoreModule",
"MyProjectNameMongoDbModule"
);
}
private void ChangeProjectReference(
ProjectBuildContext context,
string targetProjectFilePath,
string oldReference,
string newReference)
{
var file = context.GetFile(targetProjectFilePath);
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("ProjectReference") && lines[i].Contains(oldReference))
{
lines[i] = lines[i].Replace(oldReference, newReference);
file.SetLines(lines);
return;
}
}
throw new ApplicationException($"Could not find the '{oldReference}' reference in the project '{targetProjectFilePath}'!");
}
private void ChangeModuleDependency(
ProjectBuildContext context,
string targetModuleFilePath,
string oldNamespace,
string newNamespace,
string oldModuleName,
string newModuleName)
{
var file = context.GetFile(targetModuleFilePath);
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains($"using {oldNamespace};"))
{
lines[i] = $"using {newNamespace};";
}
else if (lines[i].Contains(oldModuleName))
{
lines[i] = lines[i].Replace(oldModuleName, newModuleName);
}
}
file.SetLines(lines);
}
private void ChangeConnectionStringToMongoDb(
ProjectBuildContext context,
string appsettingFilePath)
{
var file = context.GetFile(appsettingFilePath);
file.NormalizeLineEndings();
var lines = file.GetLines();
for (var i = 0; i < lines.Length; i++)
{
if (lines[i].Contains("Default") && lines[i].Contains("Database"))
{
lines[i] = " \"Default\": \"mongodb://localhost:27017|MyProjectName\"";
file.SetLines(lines);
return;
}
}
throw new ApplicationException("Could not find the 'Default' connection string in appsettings.json file!");
}
}
}
Loading…
Cancel
Save