Browse Source

related https://github.com/volosoft/volo/issues/3562: Use graphBuild to build a solution file

pull/6096/head
İsmail ÇAĞDAŞ 5 years ago
parent
commit
cd4e223ff7
  1. 82
      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. 58
      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. 42
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs
  8. 2
      framework/src/Volo.Abp.Core/Volo/Abp/Aspects/AbpCrossCuttingConcerns.cs

82
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>
@ -107,8 +96,10 @@ 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
@ -215,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('"');

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

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);
@ -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)

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

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