Remove dead code and ensure source code is cloned when building on CI
This commit is contained in:
parent
4182b0b5d2
commit
4fa08287a2
|
|
@ -52,6 +52,7 @@
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
|
<!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
|
||||||
<RepositoryBuildArguments>$(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber) /p:Configuration=$(Configuration) /p:CommitHash=$(CommitHash)</RepositoryBuildArguments>
|
<RepositoryBuildArguments>$(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber) /p:Configuration=$(Configuration) /p:CommitHash=$(CommitHash)</RepositoryBuildArguments>
|
||||||
|
<RepositoryBuildArguments>$(RepositoryBuildArguments) /noconsolelogger '/l:RepoTasks.FlowLogger,$(MSBuildThisFileDirectory)tasks\bin\publish\RepoTasks.dll;Summary;FlowId=$(RepositoryToBuild)'</RepositoryBuildArguments>
|
||||||
|
|
||||||
<BuildArguments>$(_RepositoryBuildTargets) $(RepositoryBuildArguments)</BuildArguments>
|
<BuildArguments>$(_RepositoryBuildTargets) $(RepositoryBuildArguments)</BuildArguments>
|
||||||
<RepositoryArtifactsRoot>$(BuildRepositoryRoot)artifacts</RepositoryArtifactsRoot>
|
<RepositoryArtifactsRoot>$(BuildRepositoryRoot)artifacts</RepositoryArtifactsRoot>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'=='' AND '$(CompileOnly)'=='true'">/t:Package /t:VerifyPackages</_RepositoryBuildTargets>
|
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'=='' AND '$(CompileOnly)'=='true'">/t:Package /t:VerifyPackages</_RepositoryBuildTargets>
|
||||||
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'==''">/t:Verify</_RepositoryBuildTargets>
|
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'==''">/t:Verify</_RepositoryBuildTargets>
|
||||||
|
|
||||||
<PrepareDependsOn>$(PrepareDependsOn);CleanUniverseArtifacts</PrepareDependsOn>
|
<PrepareDependsOn>$(PrepareDependsOn);CleanArtifacts;CleanUniverseArtifacts</PrepareDependsOn>
|
||||||
<CleanDependsOn>$(CleanDependsOn);CleanUniverseArtifacts</CleanDependsOn>
|
<CleanDependsOn>$(CleanDependsOn);CleanUniverseArtifacts</CleanDependsOn>
|
||||||
<BuildDependsOn>$(BuildDependsOn);BuildRepositories</BuildDependsOn>
|
<BuildDependsOn>$(BuildDependsOn);BuildRepositories</BuildDependsOn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
<Import Project="$(_RepositoryListToImport)" />
|
<Import Project="$(_RepositoryListToImport)" />
|
||||||
|
|
||||||
<Target Name="CleanUniverseArtifacts">
|
<Target Name="CleanUniverseArtifacts">
|
||||||
|
<RemoveDir Directories="$(_CloneRepositoryRoot)" Condition="Exists('$(_CloneRepositoryRoot)') AND '$(ClearRepositoryCloneRoot)' != 'false'" />
|
||||||
<RemoveDir Directories="$(RepositoryRoot)obj" Condition="Exists('$(RepositoryRoot)obj')" />
|
<RemoveDir Directories="$(RepositoryRoot)obj" Condition="Exists('$(RepositoryRoot)obj')" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
|
|
@ -49,7 +50,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<Target Name="CloneRepositories" DependsOnTargets="_PrepareRepositories">
|
<Target Name="CloneRepositories" DependsOnTargets="_PrepareRepositories" Condition="'$(ClearRepositoryCloneRoot)' != 'false'">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<_CloneRepositories Include="@(Repository);@(ShippedRepository)" />
|
<_CloneRepositories Include="@(Repository);@(ShippedRepository)" />
|
||||||
<_CloneRepository Include="$(MSBuildProjectFullPath)">
|
<_CloneRepository Include="$(MSBuildProjectFullPath)">
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System.IO;
|
|
||||||
using NuGet.ProjectModel;
|
|
||||||
|
|
||||||
namespace RepoTools.BuildGraph
|
|
||||||
{
|
|
||||||
public class DependencyGraphSpecProvider
|
|
||||||
{
|
|
||||||
readonly string _packageSpecDirectory;
|
|
||||||
|
|
||||||
public DependencyGraphSpecProvider(string packageSpecDirectory)
|
|
||||||
{
|
|
||||||
_packageSpecDirectory = packageSpecDirectory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DependencyGraphSpec GetDependencyGraphSpec(string repositoryName, string solutionPath)
|
|
||||||
{
|
|
||||||
var outputFile = Path.Combine(_packageSpecDirectory, repositoryName, Path.GetFileName(solutionPath) + ".json");
|
|
||||||
|
|
||||||
if (!File.Exists(outputFile))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return DependencyGraphSpec.Load(outputFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,11 +4,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using NuGet.LibraryModel;
|
|
||||||
using NuGet.ProjectModel;
|
|
||||||
|
|
||||||
namespace RepoTools.BuildGraph
|
namespace RepoTools.BuildGraph
|
||||||
{
|
{
|
||||||
|
|
@ -30,105 +26,8 @@ namespace RepoTools.BuildGraph
|
||||||
|
|
||||||
public IEnumerable<Project> AllProjects => Projects.Concat(SupportProjects);
|
public IEnumerable<Project> AllProjects => Projects.Concat(SupportProjects);
|
||||||
|
|
||||||
public static IList<Repository> ReadAllRepositories(IList<string> repositoryPaths, DependencyGraphSpecProvider provider)
|
|
||||||
{
|
|
||||||
var repositories = new Repository[repositoryPaths.Count];
|
|
||||||
|
|
||||||
Parallel.For(0, repositoryPaths.Count, new ParallelOptions { MaxDegreeOfParallelism = 6 }, i =>
|
|
||||||
{
|
|
||||||
var repositoryPath = repositoryPaths[i];
|
|
||||||
var repositoryName = Path.GetFileName(repositoryPath);
|
|
||||||
var repository = Read(provider, repositoryName, repositoryPath);
|
|
||||||
repositories[i] = repository;
|
|
||||||
});
|
|
||||||
|
|
||||||
return repositories;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Equals(Repository other) => string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
|
public bool Equals(Repository other) => string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Name);
|
public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Name);
|
||||||
|
|
||||||
private static Repository Read(DependencyGraphSpecProvider provider, string name, string repositoryPath)
|
|
||||||
{
|
|
||||||
var repository = new Repository(name);
|
|
||||||
|
|
||||||
ReadSharedSourceProjects(Path.Combine(repositoryPath, "shared"), repository, repository.Projects);
|
|
||||||
|
|
||||||
var srcDirectory = Path.GetFullPath(Path.Combine(repositoryPath, "src"))
|
|
||||||
.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
|
|
||||||
|
|
||||||
var solutionFiles = Directory.EnumerateFiles(repositoryPath, "*.sln");
|
|
||||||
foreach (var file in solutionFiles)
|
|
||||||
{
|
|
||||||
var spec = provider.GetDependencyGraphSpec(name, file);
|
|
||||||
if (spec == null)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var projects = spec.Projects.OrderBy(p => p.RestoreMetadata.ProjectStyle == ProjectStyle.PackageReference ? 0 : 1);
|
|
||||||
foreach (var specProject in projects)
|
|
||||||
{
|
|
||||||
var projectPath = Path.GetFullPath(specProject.FilePath)
|
|
||||||
.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
|
|
||||||
|
|
||||||
var projectGroup = projectPath.StartsWith(srcDirectory, StringComparison.OrdinalIgnoreCase) ?
|
|
||||||
repository.Projects :
|
|
||||||
repository.SupportProjects;
|
|
||||||
|
|
||||||
var project = projectGroup.FirstOrDefault(f => f.Path == specProject.FilePath);
|
|
||||||
if (project == null)
|
|
||||||
{
|
|
||||||
project = new Project(specProject.Name)
|
|
||||||
{
|
|
||||||
Repository = repository,
|
|
||||||
Path = specProject.FilePath,
|
|
||||||
Version = specProject.Version?.ToString(),
|
|
||||||
};
|
|
||||||
|
|
||||||
projectGroup.Add(project);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var package in GetPackageReferences(specProject))
|
|
||||||
{
|
|
||||||
project.PackageReferences.Add(package);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return repository;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<string> GetPackageReferences(PackageSpec specProject)
|
|
||||||
{
|
|
||||||
var allDependencies = Enumerable.Concat(
|
|
||||||
specProject.Dependencies,
|
|
||||||
specProject.TargetFrameworks.SelectMany(tfm => tfm.Dependencies))
|
|
||||||
.Distinct();
|
|
||||||
|
|
||||||
var packageReferences = allDependencies
|
|
||||||
.Where(d => d.LibraryRange.TypeConstraintAllows(LibraryDependencyTarget.Package))
|
|
||||||
.Select(d => d.Name)
|
|
||||||
.ToList();
|
|
||||||
return packageReferences;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ReadSharedSourceProjects(string sharedSourceProjectsRoot, Repository repository, IList<Project> projects)
|
|
||||||
{
|
|
||||||
if (!Directory.Exists(sharedSourceProjectsRoot))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var directory in new DirectoryInfo(sharedSourceProjectsRoot).EnumerateDirectories())
|
|
||||||
{
|
|
||||||
var project = new Project(directory.Name)
|
|
||||||
{
|
|
||||||
Repository = repository,
|
|
||||||
};
|
|
||||||
projects.Add(project);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using RepoTools.BuildGraph;
|
|
||||||
using Microsoft.Build.Framework;
|
|
||||||
using Microsoft.Build.Utilities;
|
|
||||||
|
|
||||||
namespace RepoTasks
|
|
||||||
{
|
|
||||||
public class CalculateBuildGraph : Task
|
|
||||||
{
|
|
||||||
[Required]
|
|
||||||
public ITaskItem[] Repositories { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Directory that contains the package spec files.
|
|
||||||
/// </summary>
|
|
||||||
[Required]
|
|
||||||
public string PackageSpecsDirectory { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The repository at which to root the graph at
|
|
||||||
/// </summary>
|
|
||||||
public string StartGraphAt { get; set; }
|
|
||||||
|
|
||||||
[Output]
|
|
||||||
public ITaskItem[] RepositoriesToBuildInOrder { get; set; }
|
|
||||||
|
|
||||||
public override bool Execute()
|
|
||||||
{
|
|
||||||
var graphSpecProvider = new DependencyGraphSpecProvider(PackageSpecsDirectory.Trim());
|
|
||||||
|
|
||||||
var repositoryPaths = Repositories.Select(r => r.GetMetadata("RepositoryPath")).ToList();
|
|
||||||
var repositories = Repository.ReadAllRepositories(repositoryPaths, graphSpecProvider);
|
|
||||||
|
|
||||||
var graph = GraphBuilder.Generate(repositories, StartGraphAt, Log);
|
|
||||||
var repositoriesWithOrder = new List<(ITaskItem repository, int order)>();
|
|
||||||
foreach (var repositoryTaskItem in Repositories)
|
|
||||||
{
|
|
||||||
var repositoryName = repositoryTaskItem.ItemSpec;
|
|
||||||
var graphNodeRepository = graph.FirstOrDefault(g => g.Repository.Name == repositoryName);
|
|
||||||
if (graphNodeRepository == null)
|
|
||||||
{
|
|
||||||
// StartGraphAt was specified so the graph is incomplete.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var order = TopologicalSort.GetOrder(graphNodeRepository);
|
|
||||||
repositoryTaskItem.SetMetadata("Order", order.ToString());
|
|
||||||
repositoriesWithOrder.Add((repositoryTaskItem, order));
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.LogMessage(MessageImportance.High, "Repository build order:");
|
|
||||||
foreach (var buildGroup in repositoriesWithOrder.GroupBy(r => r.order).OrderBy(g => g.Key))
|
|
||||||
{
|
|
||||||
var buildGroupRepos = buildGroup.Select(b => b.repository.ItemSpec);
|
|
||||||
Log.LogMessage(MessageImportance.High, $"{buildGroup.Key.ToString().PadLeft(2, ' ')}: {string.Join(", ", buildGroupRepos)}");
|
|
||||||
}
|
|
||||||
|
|
||||||
RepositoriesToBuildInOrder = repositoriesWithOrder
|
|
||||||
.OrderBy(r => r.order)
|
|
||||||
.Select(r => r.repository)
|
|
||||||
.ToArray();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -3,8 +3,6 @@
|
||||||
<_RepoTaskAssembly>$(MSBuildThisFileDirectory)bin\publish\RepoTasks.dll</_RepoTaskAssembly>
|
<_RepoTaskAssembly>$(MSBuildThisFileDirectory)bin\publish\RepoTasks.dll</_RepoTaskAssembly>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<UsingTask TaskName="RepoTasks.CalculateBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
|
|
||||||
<UsingTask TaskName="RepoTasks.AnalyzeBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
|
<UsingTask TaskName="RepoTasks.AnalyzeBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
<UsingTask TaskName="RepoTasks.GenerateLineup" AssemblyFile="$(_RepoTaskAssembly)" />
|
<UsingTask TaskName="RepoTasks.GenerateLineup" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
<UsingTask TaskName="RepoTasks.PinVersions" AssemblyFile="$(_RepoTaskAssembly)" />
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue