From cd4e223ff7907ebdccf31c2a0d1cfd497f36676f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Fri, 6 Nov 2020 15:35:35 +0300 Subject: [PATCH] related https://github.com/volosoft/volo/issues/3562: Use graphBuild to build a solution file --- .../Cli/Build/DefaultChangedProjectFinder.cs | 82 +------------------ .../Cli/Build/DefaultDotNetProjectBuilder.cs | 23 +++++- ...ileSystemDotNetProjectBuildConfigReader.cs | 58 ++++++++----- .../Abp/Cli/Build/IChangedProjectFinder.cs | 2 +- .../Abp/Cli/Build/IDotNetProjectBuilder.cs | 4 +- .../Volo/Abp/Cli/Bundling/BundlingService.cs | 7 +- .../Volo/Abp/Cli/Commands/BuildCommand.cs | 42 ++++++---- .../Abp/Aspects/AbpCrossCuttingConcerns.cs | 2 +- 8 files changed, 98 insertions(+), 122 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs index e9e8106cf9..e06ff7d077 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Xml.Linq; using LibGit2Sharp; using Volo.Abp.DependencyInjection; @@ -35,16 +34,6 @@ namespace Volo.Abp.Cli.Build _buildProjectListSorter = buildProjectListSorter; } - public List Find(DotNetProjectBuildConfig buildConfig) - { - if (!buildConfig.SlFilePath.IsNullOrEmpty()) - { - return FindBySlnFile(buildConfig); - } - - return FindByRepository(buildConfig); - } - /// /// Returns list of projects in a repository and its depending repositories sorted by dependencies /// @@ -107,8 +96,10 @@ namespace Volo.Abp.Cli.Build } } - private List FindByRepository(DotNetProjectBuildConfig buildConfig) + public List FindByRepository(DotNetProjectBuildConfig buildConfig) { + Console.WriteLine("Finding changed projects for repository..."); + var gitRepositoryBuildStatus = _repositoryBuildStatusStore.Get( buildConfig.BuildName, buildConfig.GitRepository @@ -215,72 +206,7 @@ namespace Volo.Abp.Cli.Build } } } - - private List FindBySlnFile(DotNetProjectBuildConfig buildConfig) - { - var allProjectList = FindAllProjects(buildConfig); - - var slFine = new FileInfo(buildConfig.SlFilePath); - var csProjFiles = slFine.Directory.GetFiles( - "*.csproj", - SearchOption.AllDirectories - ).Select(e => e.FullName) - .ToList(); - - foreach (var csProjFile in csProjFiles) - { - MarkDependantProjectsForBuild(buildConfig.GitRepository, csProjFile, allProjectList); - } - - return _buildProjectListSorter.SortByDependencies( - allProjectList, - new DotNetProjectInfoEqualityComparer() - ).Where(e => e.ShouldBuild).ToList(); - } - - private void MarkDependantProjectsForBuild( - GitRepository gitRepository, - string csProjFilePath, - List allProjectList) - { - var repositoryName = gitRepository.FindRepositoryOf(csProjFilePath); - var project = new DotNetProjectInfo(repositoryName, csProjFilePath, true); - - if (allProjectList.IsMarkedForBuild(repositoryName, csProjFilePath)) - { - return; - } - - allProjectList.MarkForBuild(project); - AddProjectDependencies(gitRepository, project, allProjectList); - } - - private void AddProjectDependencies( - GitRepository gitRepository, - DotNetProjectInfo project, - List allProjectList) - { - var projectInfo = allProjectList.FirstOrDefault(e => e.CsProjPath == project.CsProjPath); - if (projectInfo == null) - { - return; - } - - var dependencies = projectInfo.Dependencies; - - foreach (var dependency in dependencies) - { - if (allProjectList.IsMarkedForBuild(dependency.RepositoryName, dependency.CsProjPath)) - { - continue; - } - - allProjectList.MarkForBuild(dependency.RepositoryName, dependency.CsProjPath); - - AddProjectDependencies(gitRepository, dependency, allProjectList); - } - } - + private void AddDependingProjectsToList( string repositoryName, string csProjPath, diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs index 65749fd45c..dba7cebb86 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Cli.Build { public class DefaultDotNetProjectBuilder : IDotNetProjectBuilder, ITransientDependency { - public List Build(List projects, string arguments) + public List BuildProjects(List projects, string arguments) { var builtProjects = new ConcurrentBag(); var totalProjectCountToBuild = projects.Count; @@ -42,6 +42,27 @@ namespace Volo.Abp.Cli.Build return builtProjects.ToList(); } + public void BuildSolution(string slnPath, string arguments) + { + var buildArguments = "/graphBuild " + arguments.TrimStart('"').TrimEnd('"'); + Console.WriteLine("Executing...: dotnet build " + slnPath + " " + buildArguments); + + var output = CmdHelper.RunCmdAndGetOutput( + "dotnet build " + slnPath + " " + buildArguments, + out int buildStatus + ); + + if (buildStatus == 0) + { + WriteOutput(output, ConsoleColor.Green); + } + else + { + WriteOutput(output, ConsoleColor.Red); + throw new Exception("Build failed!"); + } + } + private void BuildInternal(DotNetProjectInfo project, string arguments, ConcurrentBag builtProjects) { var buildArguments = arguments.TrimStart('"').TrimEnd('"'); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/FileSystemDotNetProjectBuildConfigReader.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/FileSystemDotNetProjectBuildConfigReader.cs index bb714f13aa..bc9074e869 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/FileSystemDotNetProjectBuildConfigReader.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/FileSystemDotNetProjectBuildConfigReader.cs @@ -26,8 +26,15 @@ namespace Volo.Abp.Cli.Build { buildConfig.SlFilePath = solutionFiles.First(); var configFile = GetClosestFile(directoryPath, _buildConfigName); - var configFileContent = File.ReadAllText(configFile); - buildConfig.GitRepository = _jsonSerializer.Deserialize(configFileContent); + if (configFile.IsNullOrEmpty()) + { + buildConfig.GitRepository = GetGitRepositoryUsingDirectory(directoryPath); + } + else + { + var configFileContent = File.ReadAllText(configFile); + buildConfig.GitRepository = _jsonSerializer.Deserialize(configFileContent); + } SetBranchNames(buildConfig.GitRepository); @@ -53,23 +60,34 @@ namespace Volo.Abp.Cli.Build ); } - // use current directory to get repository info - var gitFolderPath = string.Concat(directoryPath, @"\.git"); - if (!Directory.Exists(gitFolderPath)) + return new DotNetProjectBuildConfig { - throw new Exception("There is no solution file (*.sln) and " + _buildConfigName + - " in the working directory and working directory is not a GIT repository !"); - } + GitRepository = GetGitRepositoryUsingDirectory(directoryPath) + }; + } - using (var repo = new Repository(string.Concat(directoryPath, @"\.git"))) + private GitRepository GetGitRepositoryUsingDirectory(string directoryPath) + { + var directoryInfo = new DirectoryInfo(directoryPath); + + do { - var repositoryName = GetRepositoryNameFromRepositoryInfo(repo); - - return new DotNetProjectBuildConfig + var gitFolderPath = string.Concat(directoryInfo.FullName, @"\.git"); + if (Directory.Exists(gitFolderPath)) { - GitRepository = new GitRepository(repositoryName, repo.Head.FriendlyName, directoryPath) - }; - } + using (var repo = new Repository(string.Concat(directoryInfo.FullName, @"\.git"))) + { + var repositoryName = GetRepositoryNameFromRepositoryInfo(repo); + + return new GitRepository(repositoryName, repo.Head.FriendlyName, directoryInfo.FullName); + } + } + + directoryInfo = directoryInfo.Parent; + } while (directoryInfo?.Parent != null); + + throw new Exception("There is no solution file (*.sln) and " + _buildConfigName + + " in the working directory and working directory is not a GIT repository !"); } private string GetRepositoryNameFromRepositoryInfo(Repository repository) @@ -79,24 +97,24 @@ namespace Volo.Abp.Cli.Build { throw new Exception("Remote origin is null for given repository !"); } - + var remoteUrl = remote.Url; - + remoteUrl = Regex.Replace(remoteUrl, @"\.git$", ""); remoteUrl = Regex.Replace(remoteUrl, "^git@", "https://"); remoteUrl = Regex.Replace(remoteUrl, "^https:git@", "https://"); remoteUrl = Regex.Replace(remoteUrl, ".com:", ".com/"); - + var remoteUri = new Uri(remoteUrl); var pathSegments = remoteUri.AbsolutePath.Split("/", StringSplitOptions.RemoveEmptyEntries); - + if (pathSegments != null && pathSegments.Length >= 2) { var repo = pathSegments[1]; return repo; } - + throw new Exception("Couldn't find repository name using remote origin url !"); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IChangedProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IChangedProjectFinder.cs index b381a073b4..2d86ba12c6 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IChangedProjectFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IChangedProjectFinder.cs @@ -4,6 +4,6 @@ namespace Volo.Abp.Cli.Build { public interface IChangedProjectFinder { - List Find(DotNetProjectBuildConfig buildConfig); + List FindByRepository(DotNetProjectBuildConfig buildConfig); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IDotNetProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IDotNetProjectBuilder.cs index 02f753c325..5aeef11e28 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IDotNetProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IDotNetProjectBuilder.cs @@ -4,6 +4,8 @@ namespace Volo.Abp.Cli.Build { public interface IDotNetProjectBuilder { - List Build(List projects, string arguments); + List BuildProjects(List projects, string arguments); + + void BuildSolution(string slnPath, string arguments); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs index 3057e81002..1e5dee5c2b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs @@ -40,7 +40,8 @@ namespace Volo.Abp.Cli.Bundling { new DotNetProjectInfo(string.Empty, projectFilePath, true) }; - DotNetProjectBuilder.Build(projects, string.Empty); + + DotNetProjectBuilder.BuildProjects(projects, string.Empty); } var frameworkVersion = GetTargetFrameworkVersion(projectFilePath); @@ -51,10 +52,10 @@ namespace Volo.Abp.Cli.Bundling FindBundleContributersRecursively(startupModule, 0, bundleDefinitions); bundleDefinitions = bundleDefinitions.OrderByDescending(t => t.Level).ToList(); - var styleDefinitons = GenerateStyleDefinitions(bundleDefinitions); + var styleDefinitions = GenerateStyleDefinitions(bundleDefinitions); var scriptDefinitions = GenerateScriptDefinitions(bundleDefinitions); - await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitons, scriptDefinitions); + await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitions, scriptDefinitions); } protected virtual async Task UpdateDependenciesInHtmlFileAsync(string directory, string styleDefinitions, string scriptDefinitions) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs index 253977c70b..173c3cd277 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs @@ -53,23 +53,31 @@ namespace Volo.Abp.Cli.Commands buildConfig.BuildName = buildName; buildConfig.ForceBuild = forceBuild; - Console.WriteLine("Finding changed projects..."); - - var changedProjectFiles = ChangedProjectFinder.Find(buildConfig); - - var buildSucceededProjects = DotNetProjectBuilder.Build( - changedProjectFiles, - dotnetBuildArguments ?? "" - ); - - var buildStatus = BuildStatusGenerator.Generate( - buildConfig, - changedProjectFiles, - buildSucceededProjects - ); - - RepositoryBuildStatusStore.Set(buildName, buildConfig.GitRepository, buildStatus); - + if (string.IsNullOrEmpty(buildConfig.SlFilePath)) + { + var changedProjectFiles = ChangedProjectFinder.FindByRepository(buildConfig); + + var buildSucceededProjects = DotNetProjectBuilder.BuildProjects( + changedProjectFiles, + dotnetBuildArguments ?? "" + ); + + var buildStatus = BuildStatusGenerator.Generate( + buildConfig, + changedProjectFiles, + buildSucceededProjects + ); + + RepositoryBuildStatusStore.Set(buildName, buildConfig.GitRepository, buildStatus); + } + else + { + DotNetProjectBuilder.BuildSolution( + buildConfig.SlFilePath, + dotnetBuildArguments ?? "" + ); + } + sw.Stop(); Console.WriteLine("Build operation is completed in " + sw.ElapsedMilliseconds + " (ms)"); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs index 8c861884e8..af4df9c68c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs @@ -76,4 +76,4 @@ namespace Volo.Abp.Aspects return crossCuttingEnabledObj.AppliedCrossCuttingConcerns.ToArray(); } } -} \ No newline at end of file +}