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 e866c425b5..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 /// @@ -55,32 +44,38 @@ namespace Volo.Abp.Cli.Build var projects = new List(); AddProjectsOfRepository(buildConfig.GitRepository, projects); - + _dotNetProjectDependencyFiller.Fill(projects); - + var allSortedProjectList = _buildProjectListSorter.SortByDependencies( projects, new DotNetProjectInfoEqualityComparer() ); - - FilterIgnoredDirectories(allSortedProjectList, buildConfig.GitRepository); - return allSortedProjectList; + return FilterIgnoredDirectories(allSortedProjectList, buildConfig.GitRepository); } - private void FilterIgnoredDirectories(List projects, GitRepository gitRepository) + private List FilterIgnoredDirectories(List projects, + GitRepository gitRepository) { foreach (var ignoredDirectory in gitRepository.IgnoredDirectories) { + Console.WriteLine("projects count 1:" + projects.Count); + Console.WriteLine("Ignoring Directory...:" + Path.Combine(gitRepository.RootPath, ignoredDirectory)); + projects = projects.Where(e => !e.CsProjPath.StartsWith(Path.Combine(gitRepository.RootPath, ignoredDirectory))) .ToList(); + + Console.WriteLine("projects count 2:" + projects.Count); } foreach (var dependingRepository in gitRepository.DependingRepositories) { FilterIgnoredDirectories(projects, dependingRepository); } + + return projects; } private void AddProjectsOfRepository(GitRepository gitRepository, List projects) @@ -101,15 +96,17 @@ 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 ); - + var allSortedProjectList = FindAllProjects(buildConfig); - + MarkProjectsForBuild( buildConfig.GitRepository, gitRepositoryBuildStatus, @@ -209,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 5aed3d0941..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 @@ -1,6 +1,7 @@ using System; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using LibGit2Sharp; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; @@ -25,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); @@ -45,11 +53,69 @@ namespace Volo.Abp.Cli.Build return buildConfig; } - Console.WriteLine( - "There are more than 1 config (abp-build-config.json) file in the directory!" - ); + if (configFiles.Length > 1) + { + throw new Exception( + "There are more than 1 config (abp-build-config.json) file in the directory!" + ); + } + + return new DotNetProjectBuildConfig + { + GitRepository = GetGitRepositoryUsingDirectory(directoryPath) + }; + } + + private GitRepository GetGitRepositoryUsingDirectory(string directoryPath) + { + var directoryInfo = new DirectoryInfo(directoryPath); + + do + { + var gitFolderPath = string.Concat(directoryInfo.FullName, @"\.git"); + if (Directory.Exists(gitFolderPath)) + { + 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) + { + var remote = repository.Network.Remotes.FirstOrDefault(r => r.Name == "origin"); + if (remote == null) + { + 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("There is no solution file (*.sln) or " + _buildConfigName + " in the working directory !"); + throw new Exception("Couldn't find repository name using remote origin url !"); } private void SetBranchNames(GitRepository gitRepository) 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 78fed24a91..001e33c5df 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); @@ -53,10 +54,10 @@ namespace Volo.Abp.Cli.Bundling var styleContext = GetStyleContext(bundleDefinitions); var scriptContext = GetScriptContext(bundleDefinitions); - var styleDefinitons = GenerateStyleDefinitions(styleContext); + var styleDefinitions = GenerateStyleDefinitions(styleContext); var scriptDefinitions = GenerateScriptDefinitions(scriptContext); - await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitons, scriptDefinitions); + await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitions, scriptDefinitions); } private BundleContext GetScriptContext(List bundleDefinitions) 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 6d28b39fad..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 @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Cli.Args; @@ -51,24 +52,32 @@ namespace Volo.Abp.Cli.Commands var buildConfig = DotNetProjectBuildConfigReader.Read(workingDirectory ?? Directory.GetCurrentDirectory()); 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 +}