diff --git a/docs/en/CLI.md b/docs/en/CLI.md index ebf27952b3..2dda0b6ae5 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -113,6 +113,7 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `SqlServer` * `MySQL` * `SQLite` + * `Oracle` * `Oracle-Devart` * `PostgreSQL` * `--local-framework-ref --abp-path`: Uses local projects references to the ABP framework instead of using the NuGet packages. This can be useful if you download the ABP Framework source code and have a local reference to the framework from your application. diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs index 088cadb707..56e5c0a03b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/SourceCodeDownloadService.cs @@ -203,30 +203,7 @@ namespace Volo.Abp.Cli.Commands.Services return false; } - if (zipEntryName.Contains(Path.Combine("angular/e2e"))) - { - return true; - } - if (zipEntryName.Contains(Path.Combine("angular/src"))) - { - return true; - } - if (zipEntryName.Contains(Path.Combine("angular/node_modules"))) - { - return true; - } - if (zipEntryName.Contains(Path.Combine("angular/scripts"))) - { - return true; - } - if (zipEntryName.Contains(Path.Combine("angular/source-code-requirements"))) - { - return true; - } - - var fileName = Path.GetFileName(zipEntryName); - - if (!string.IsNullOrEmpty(fileName) && zipEntryName.Equals("angular/" + fileName)) + if (zipEntryName.StartsWith("angular/") && !zipEntryName.StartsWith("angular/projects")) { return true; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 52a06f7117..bd79006b9f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -210,10 +210,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App { if (string.IsNullOrWhiteSpace(context.BuildArgs.Version)) { - // We'll return true after 4.3.0 stable release. see https://github.com/abpframework/abp/issues/8394 - // return true; - - return context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.Preview.Long); + return true; } return SemanticVersion.Parse(context.BuildArgs.Version) > SemanticVersion.Parse("4.2.9"); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs index 8f56902ab7..309d0a1552 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateSwitchEntityFrameworkCoreToMongoDbStep.cs @@ -227,7 +227,12 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App string oldReference, string newReference) { - var file = context.GetFile(targetProjectFilePath); + var file = context.FindFile(targetProjectFilePath); + + if (file == null) + { + return; + } file.NormalizeLineEndings(); @@ -253,7 +258,12 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App string oldKeyword, string newKeyword) { - var file = context.GetFile(targetModuleFilePath); + var file = context.FindFile(targetModuleFilePath); + + if (file == null) + { + return; + } file.NormalizeLineEndings(); @@ -278,7 +288,12 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App ProjectBuildContext context, string appsettingFilePath) { - var file = context.GetFile(appsettingFilePath); + var file = context.FindFile(appsettingFilePath); + + if (file == null) + { + return; + } file.NormalizeLineEndings(); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs index 9d95f818d1..93626d682d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/AngularSourceCodeAdder.cs @@ -246,6 +246,12 @@ namespace Volo.Abp.Cli.ProjectModification var foldersUnderProject = Directory.GetDirectories(Path.Combine(folder, "projects")); foreach (var folderUnderProject in foldersUnderProject) { + if (Path.GetFileName(folderUnderProject) == "dev-app") + { + Directory.Delete(folderUnderProject, true); + continue; + } + if (Directory.Exists(Path.Combine(folder, Path.GetFileName(folderUnderProject)))) { continue; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackageInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackageInfo.cs index 47f0f1092d..dc86a720cf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackageInfo.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackageInfo.cs @@ -5,5 +5,9 @@ public string Name { get; set; } public NpmApplicationType ApplicationType { get; set; } + + public string MinVersion { get; set; } + + public string MaxVersion { get; set; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 3b5e695203..8d30a535fd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -135,24 +135,25 @@ namespace Volo.Abp.Cli.ProjectModification private ModuleWithMastersInfo RemoveIncompatiblePackages(ModuleWithMastersInfo module, string version) { - module.NugetPackages.RemoveAll(np => IsPackageInCompatible(np, version)); + module.NugetPackages.RemoveAll(np => IsPackageInCompatible(np.MinVersion, np.MaxVersion, version)); + module.NpmPackages.RemoveAll(np => IsPackageInCompatible(np.MinVersion, np.MaxVersion, version)); return module; } - private bool IsPackageInCompatible(NugetPackageInfo package, string version) + private bool IsPackageInCompatible(string minVersion, string maxVersion, string version) { try { - if (!string.IsNullOrWhiteSpace(package.MinVersion)) + if (!string.IsNullOrWhiteSpace(minVersion)) { - if (SemanticVersion.Parse(package.MinVersion) > SemanticVersion.Parse(version)) + if (SemanticVersion.Parse(minVersion) > SemanticVersion.Parse(version)) { return true; } } - if (!string.IsNullOrWhiteSpace(package.MaxVersion)) + if (!string.IsNullOrWhiteSpace(maxVersion)) { - if (SemanticVersion.Parse(package.MaxVersion) < SemanticVersion.Parse(version)) + if (SemanticVersion.Parse(maxVersion) < SemanticVersion.Parse(version)) { return true; } @@ -186,6 +187,7 @@ namespace Volo.Abp.Cli.ProjectModification private async Task RemoveUnnecessaryProjectsAsync(string solutionDirectory, ModuleWithMastersInfo module, string[] projectFiles) { + var projectsToRemove = new List(); var moduleDirectory = Path.Combine(solutionDirectory, "modules", module.Name); var moduleSolutionFile = Directory.GetFiles(moduleDirectory, "*.sln", SearchOption.TopDirectoryOnly).First(); var isProjectTiered = await IsProjectTiered(projectFiles); @@ -194,10 +196,10 @@ namespace Volo.Abp.Cli.ProjectModification var blazorProject = projectFiles.FirstOrDefault(p => p.EndsWith(".Blazor.csproj")); if (blazorProject == null) { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.Blazor, isProjectTiered); - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.BlazorServer, isProjectTiered); - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.BlazorWebAssembly, isProjectTiered); - await RemoveProjectByPostFix(module, moduleSolutionFile, "src", ".Blazor"); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.Blazor, isProjectTiered)); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.BlazorServer, isProjectTiered)); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.BlazorWebAssembly, isProjectTiered)); + projectsToRemove.AddRange(await FindProjectsToRemoveByPostFix(moduleDirectory, "src", ".Blazor")); } else { @@ -205,39 +207,58 @@ namespace Volo.Abp.Cli.ProjectModification if (isBlazorServer) { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.BlazorWebAssembly, isProjectTiered); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.BlazorWebAssembly, isProjectTiered)); webPackagesWillBeAddedToBlazorServerProject = module.NugetPackages.All(np=> np.Target != NuGetPackageTarget.BlazorServer && np.TieredTarget != NuGetPackageTarget.BlazorServer); } else { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.BlazorServer, isProjectTiered); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.BlazorServer, isProjectTiered)); } } if (!projectFiles.Any(p => p.EndsWith(".Web.csproj")) && !webPackagesWillBeAddedToBlazorServerProject) { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.Web, isProjectTiered); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.Web, isProjectTiered)); } if (!projectFiles.Any(p => p.EndsWith(".MongoDB.csproj"))) { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.MongoDB, isProjectTiered); - await RemoveProjectByPostFix(module, moduleSolutionFile, "test", ".MongoDB.Tests"); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.MongoDB, isProjectTiered)); + projectsToRemove.AddRange(await FindProjectsToRemoveByPostFix(moduleDirectory, "test", ".MongoDB.Tests")); } if (!projectFiles.Any(p => p.EndsWith(".EntityFrameworkCore.csproj"))) { - await RemoveProjectByTarget(module, moduleSolutionFile, NuGetPackageTarget.EntityFrameworkCore, isProjectTiered); - await RemoveProjectByPostFix(module, moduleSolutionFile, "test", ".EntityFrameworkCore.Tests"); - await RemoveProjectByPostFix(module, moduleSolutionFile, "test", ".Application.Tests"); + projectsToRemove.AddRange(await FindProjectsToRemoveByTarget(module, NuGetPackageTarget.EntityFrameworkCore, isProjectTiered)); + projectsToRemove.AddRange(await FindProjectsToRemoveByPostFix(moduleDirectory, "test", ".EntityFrameworkCore.Tests")); + projectsToRemove.AddRange(await FindProjectsToRemoveByPostFix(moduleDirectory, "test", ".Application.Tests")); ChangeDomainTestReferenceToMongoDB(module, moduleSolutionFile); } + + foreach (var projectToRemove in projectsToRemove) + { + if (IsReferencedByAnotherModuleProject(moduleDirectory, projectsToRemove, projectToRemove)) + { + continue; + } + + RemoveProjectFromSolutionAsync(moduleSolutionFile, projectToRemove); + } } - private async Task RemoveProjectByTarget(ModuleWithMastersInfo module, string moduleSolutionFile, + private bool IsReferencedByAnotherModuleProject(string moduleDirectory, List projectsToRemove, string projectToRemove) + { + var moduleProjects = Directory.GetFiles(moduleDirectory, "*.csproj", SearchOption.AllDirectories); + var projectsToKeep = moduleProjects.Where(mp=> !projectsToRemove.Contains(Path.GetFileName(mp).RemovePostFix(".csproj"))).ToList(); + return projectsToKeep.Select(File.ReadAllText).Any(content => content.Contains($"\"{projectToRemove}\"")); + } + + private async Task> FindProjectsToRemoveByTarget(ModuleWithMastersInfo module, NuGetPackageTarget target, bool isTieredProject) { + var projectsToRemove = new List(); + var packages = module.NugetPackages.Where(n => (isTieredProject && n.TieredTarget != NuGetPackageTarget.Undefined ? n.TieredTarget @@ -251,37 +272,42 @@ namespace Volo.Abp.Cli.ProjectModification continue; } - await SolutionFileModifier.RemoveProjectFromSolutionFileAsync(moduleSolutionFile, package.Name); - - var projectPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "src", package.Name); - if (Directory.Exists(projectPath)) - { - Directory.Delete(projectPath, true); - } + projectsToRemove.Add(package.Name); } + + return projectsToRemove; } - private async Task RemoveProjectByPostFix(ModuleWithMastersInfo module, string moduleSolutionFile, string targetFolder, + private async Task> FindProjectsToRemoveByPostFix(string moduleDirectory, string targetFolder, string postFix) { - var srcPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), targetFolder); + var projectsToRemove = new List(); + var srcPath = Path.Combine(moduleDirectory, targetFolder); if (!Directory.Exists(srcPath)) { - return; + return projectsToRemove; } var projectFolderPaths = Directory.GetDirectories(srcPath).Where(d => d.EndsWith(postFix)).ToList(); foreach (var projectFolderPath in projectFolderPaths) { - await SolutionFileModifier.RemoveProjectFromSolutionFileAsync(moduleSolutionFile, new DirectoryInfo(projectFolderPath).Name); + projectsToRemove.Add(new DirectoryInfo(projectFolderPath).Name); + } + return projectsToRemove; + } + + private async Task RemoveProjectFromSolutionAsync(string moduleSolutionFile, string projectName) + { + await SolutionFileModifier.RemoveProjectFromSolutionFileAsync(moduleSolutionFile, projectName); + + var projectFolderPath = Path.Combine(Path.GetDirectoryName(moduleSolutionFile), "src", projectName); if (Directory.Exists(projectFolderPath)) { Directory.Delete(projectFolderPath, true); } - } } private void ChangeDomainTestReferenceToMongoDB(ModuleWithMastersInfo module, string moduleSolutionFile)