Browse Source

Merge pull request #6096 from abpframework/feat/3562

Build command enhancements
pull/6106/head
İsmail ÇAĞDAŞ 6 years ago
committed by GitHub
parent
commit
e14f7c9ad4
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 104
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs
  2. 23
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultDotNetProjectBuilder.cs
  3. 78
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/FileSystemDotNetProjectBuildConfigReader.cs
  4. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IChangedProjectFinder.cs
  5. 4
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IDotNetProjectBuilder.cs
  6. 7
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs
  7. 45
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs
  8. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs

104
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<DotNetProjectInfo> Find(DotNetProjectBuildConfig buildConfig)
{
if (!buildConfig.SlFilePath.IsNullOrEmpty())
{
return FindBySlnFile(buildConfig);
}
return FindByRepository(buildConfig);
}
/// <summary>
/// Returns list of projects in a repository and its depending repositories sorted by dependencies
/// </summary>
@ -55,32 +44,38 @@ namespace Volo.Abp.Cli.Build
var projects = new List<DotNetProjectInfo>();
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<DotNetProjectInfo> projects, GitRepository gitRepository)
private List<DotNetProjectInfo> FilterIgnoredDirectories(List<DotNetProjectInfo> 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<DotNetProjectInfo> projects)
@ -101,15 +96,17 @@ namespace Volo.Abp.Cli.Build
}
}
private List<DotNetProjectInfo> FindByRepository(DotNetProjectBuildConfig buildConfig)
public List<DotNetProjectInfo> 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<DotNetProjectInfo> 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<DotNetProjectInfo> 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<DotNetProjectInfo> 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,

23
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<string> Build(List<DotNetProjectInfo> projects, string arguments)
public List<string> BuildProjects(List<DotNetProjectInfo> projects, string arguments)
{
var builtProjects = new ConcurrentBag<string>();
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<string> builtProjects)
{
var buildArguments = arguments.TrimStart('"').TrimEnd('"');

78
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<GitRepository>(configFileContent);
if (configFile.IsNullOrEmpty())
{
buildConfig.GitRepository = GetGitRepositoryUsingDirectory(directoryPath);
}
else
{
var configFileContent = File.ReadAllText(configFile);
buildConfig.GitRepository = _jsonSerializer.Deserialize<GitRepository>(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)

2
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<DotNetProjectInfo> Find(DotNetProjectBuildConfig buildConfig);
List<DotNetProjectInfo> FindByRepository(DotNetProjectBuildConfig buildConfig);
}
}

4
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<string> Build(List<DotNetProjectInfo> projects, string arguments);
List<string> BuildProjects(List<DotNetProjectInfo> projects, string arguments);
void BuildSolution(string slnPath, string arguments);
}
}

7
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<BundleTypeDefinition> bundleDefinitions)

45
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)");

2
framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs

@ -76,4 +76,4 @@ namespace Volo.Abp.Aspects
return crossCuttingEnabledObj.AppliedCrossCuttingConcerns.ToArray();
}
}
}
}

Loading…
Cancel
Save