From 7c0d83e7ff09a1bd4e4e9cc6521d60e4fe8ac23b Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 3 Nov 2017 16:20:29 -0700 Subject: [PATCH] Stop producing PackageLineup and remove obsolete code (#628) --- build/RepositoryBuild.targets | 23 +- ...Internal.AspNetCore.Partners.Lineup.nuspec | 17 -- ...Internal.AspNetCore.Universe.Lineup.nuspec | 5 - build/repo.targets | 10 +- build/repobuild/AfterKoreBuild.targets | 7 - build/repobuild/BeforeKoreBuild.props | 13 - build/tasks/PinVersions.cs | 46 ---- build/tasks/RepoTasks.tasks | 1 - .../DependencyGraphSpecProvider.cs | 98 ------- .../tasks/VersionPinning/PinVersionUtility.cs | 241 ------------------ 10 files changed, 4 insertions(+), 457 deletions(-) delete mode 100644 build/lineups/Internal.AspNetCore.Partners.Lineup.nuspec delete mode 100644 build/repobuild/AfterKoreBuild.targets delete mode 100644 build/repobuild/BeforeKoreBuild.props delete mode 100644 build/tasks/PinVersions.cs delete mode 100644 build/tasks/VersionPinning/DependencyGraphSpecProvider.cs delete mode 100644 build/tasks/VersionPinning/PinVersionUtility.cs diff --git a/build/RepositoryBuild.targets b/build/RepositoryBuild.targets index 13b2d979b0..becde05fda 100644 --- a/build/RepositoryBuild.targets +++ b/build/RepositoryBuild.targets @@ -24,17 +24,12 @@ Properties="BuildGroup=%(BatchedRepository.BuildGroup);BuildNumber=$(BuildNumber)" /> - + - $(RepositoryBuildArguments) '/p:Universe_Version=$(Version)' - $(RepositoryBuildArguments) '/p:Universe_LineupBuildDir=$(LineupBuildDir)' - $(RepositoryBuildArguments) '/p:Universe_AdditionalRestoreSources=$(IntermediateMirrorPackageDir)' - $(RepositoryBuildArguments) '/p:Universe_IntermediateDir=$(IntermediateDir)' $(RepositoryBuildArguments) '/p:DotNetPackageVersionPropsPath=$(GeneratedPackageVersionPropsPath)' - $(RepositoryBuildArguments) '/p:CustomBeforeKoreBuildProps=$(MSBuildThisFileDirectory)repobuild\BeforeKoreBuild.props' - $(RepositoryBuildArguments) '/p:CustomAfterKoreBuildTargets=$(MSBuildThisFileDirectory)repobuild\AfterKoreBuild.targets' - $(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber) /p:Configuration=$(Configuration) + $(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber) + $(RepositoryBuildArguments) /p:Configuration=$(Configuration) $(RepositoryBuildArguments) /noconsolelogger '/l:RepoTasks.FlowLogger,$(MSBuildThisFileDirectory)tasks\bin\publish\RepoTasks.dll;Summary;FlowId=$(RepositoryToBuild)' $(_RepositoryBuildTargets) $(RepositoryBuildArguments) @@ -73,16 +68,4 @@ - - - - - - - - - diff --git a/build/lineups/Internal.AspNetCore.Partners.Lineup.nuspec b/build/lineups/Internal.AspNetCore.Partners.Lineup.nuspec deleted file mode 100644 index 66ebb614e0..0000000000 --- a/build/lineups/Internal.AspNetCore.Partners.Lineup.nuspec +++ /dev/null @@ -1,17 +0,0 @@ - - - - Internal.AspNetCore.Partners.Lineup - $version$ - Microsoft - This package used to unify external dependency versions. Internal use only. - - - - - - - - diff --git a/build/lineups/Internal.AspNetCore.Universe.Lineup.nuspec b/build/lineups/Internal.AspNetCore.Universe.Lineup.nuspec index a5477ffa2b..e1d128883a 100644 --- a/build/lineups/Internal.AspNetCore.Universe.Lineup.nuspec +++ b/build/lineups/Internal.AspNetCore.Universe.Lineup.nuspec @@ -8,11 +8,6 @@ - - - diff --git a/build/repo.targets b/build/repo.targets index d907ee1eaf..5c6e445532 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -59,13 +59,6 @@ - - - - @@ -78,8 +71,7 @@ + Properties="version=$(Version);dependenciesPropsFile=$(GeneratedPackageVersionPropsPath)"> diff --git a/build/repobuild/AfterKoreBuild.targets b/build/repobuild/AfterKoreBuild.targets deleted file mode 100644 index c482209e13..0000000000 --- a/build/repobuild/AfterKoreBuild.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/build/repobuild/BeforeKoreBuild.props b/build/repobuild/BeforeKoreBuild.props deleted file mode 100644 index f7fbcf8abd..0000000000 --- a/build/repobuild/BeforeKoreBuild.props +++ /dev/null @@ -1,13 +0,0 @@ - - - - - $([MSBuild]::NormalizeDirectory($(Universe_IntermediateDir)))packages\ - - $(PolicyRestoreAdditionalSources);$(Universe_LineupBuildDir) - - - - - - diff --git a/build/tasks/PinVersions.cs b/build/tasks/PinVersions.cs deleted file mode 100644 index b98c878173..0000000000 --- a/build/tasks/PinVersions.cs +++ /dev/null @@ -1,46 +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.Linq; -using Microsoft.Build.Framework; -using RepoTasks.VersionPinning; - -namespace RepoTasks -{ - public class PinVersions : Microsoft.Build.Utilities.Task - { - [Required] - public string BuildRepositoryRoot { get; set; } - - [Required] - public ITaskItem[] PackageSources { get; set; } - - public string GraphSpecsRoot { get; set; } - - public override bool Execute() - { - if (PackageSources?.Length == 0) - { - Log.LogError($"Missing PackageSources. At least one item source must be specified."); - return false; - } - - var graphSpecProvider = !string.IsNullOrEmpty(GraphSpecsRoot) - ? new DependencyGraphSpecProvider(GraphSpecsRoot) - : DependencyGraphSpecProvider.Default; - - using (graphSpecProvider) - { - var pinVersionUtility = new PinVersionUtility( - BuildRepositoryRoot, - PackageSources.Select(i => i.ItemSpec).ToList(), - graphSpecProvider, - Log); - pinVersionUtility.Execute(); - } - - return true; - } - } -} diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index 7d33d0ad09..b3cb598991 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -5,6 +5,5 @@ - diff --git a/build/tasks/VersionPinning/DependencyGraphSpecProvider.cs b/build/tasks/VersionPinning/DependencyGraphSpecProvider.cs deleted file mode 100644 index 1a5e2af362..0000000000 --- a/build/tasks/VersionPinning/DependencyGraphSpecProvider.cs +++ /dev/null @@ -1,98 +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.Diagnostics; -using System.IO; -using NuGet.ProjectModel; - -namespace RepoTasks.VersionPinning -{ - public class DependencyGraphSpecProvider : IDisposable - { - private readonly string _packageSpecDirectory; - private readonly bool _deleteSpecDirectoryOnDispose; - private readonly string _dotnetPath; - - public DependencyGraphSpecProvider(string packageSpecDirectory) - : this(packageSpecDirectory, deleteSpecDirectoryOnDispose: false) - { - } - - private DependencyGraphSpecProvider(string packageSpecDirectory, bool deleteSpecDirectoryOnDispose) - { - _packageSpecDirectory = packageSpecDirectory; - _deleteSpecDirectoryOnDispose = deleteSpecDirectoryOnDispose; - _dotnetPath = Process.GetCurrentProcess().MainModule.FileName; - } - - public static DependencyGraphSpecProvider Default { get; } = - new DependencyGraphSpecProvider(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()), deleteSpecDirectoryOnDispose: true); - - public DependencyGraphSpec GetDependencyGraphSpec(string repositoryName, string solutionPath) - { - var outputFile = Path.Combine(_packageSpecDirectory, repositoryName, Path.GetFileName(solutionPath) + ".json"); - - if (!File.Exists(outputFile)) - { - RunMSBuild(solutionPath, outputFile); - } - - return DependencyGraphSpec.Load(outputFile); - } - - private void RunMSBuild(string solutionPath, string outputFile) - { - var psi = new ProcessStartInfo(_dotnetPath); - - var arguments = new List - { - "msbuild", - $"\"{solutionPath}\"", - "/t:GenerateRestoreGraphFile", - "/nologo", - "/v:q", - "/p:BuildProjectReferences=false", - $"/p:RestoreGraphOutputPath=\"{outputFile}\"", - "/p:KoreBuildRestoreTargetsImported=true", - }; - - psi.Arguments = string.Join(" ", arguments); - psi.RedirectStandardOutput = true; - - var process = new Process - { - StartInfo = psi, - EnableRaisingEvents = true, - }; - process.OutputDataReceived += (sender, args) => - { - if (!string.IsNullOrEmpty(args.Data)) - { - Console.WriteLine(args.Data); - } - }; - - using (process) - { - process.Start(); - process.BeginOutputReadLine(); - - process.WaitForExit(60 * 5000); - if (process.ExitCode != 0) - { - throw new Exception($"{psi.FileName} {psi.Arguments} failed. Exit code {process.ExitCode}."); - } - } - } - - public void Dispose() - { - if (_deleteSpecDirectoryOnDispose) - { - Directory.Delete(_packageSpecDirectory, recursive: true); - } - } - } -} diff --git a/build/tasks/VersionPinning/PinVersionUtility.cs b/build/tasks/VersionPinning/PinVersionUtility.cs deleted file mode 100644 index c94e19fc62..0000000000 --- a/build/tasks/VersionPinning/PinVersionUtility.cs +++ /dev/null @@ -1,241 +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.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using System.Xml.Linq; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Common; -using NuGet.Frameworks; -using NuGet.LibraryModel; -using NuGet.ProjectModel; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; -using NuGet.Versioning; - -namespace RepoTasks.VersionPinning -{ - internal class PinVersionUtility - { - private readonly string _repositoryRoot; - private readonly FindPackageByIdResource[] _findPackageResources; - private readonly ConcurrentDictionary> _exactMatches = new ConcurrentDictionary>(StringComparer.OrdinalIgnoreCase); - private readonly DependencyGraphSpecProvider _provider; - private readonly SourceCacheContext _sourceCacheContext; - private readonly TaskLoggingHelper _logger; - - public PinVersionUtility( - string repositoryRoot, - List pinSources, - DependencyGraphSpecProvider provider, - TaskLoggingHelper logger) - { - _repositoryRoot = repositoryRoot; - _findPackageResources = new FindPackageByIdResource[pinSources.Count]; - for (var i = 0; i < pinSources.Count; i++) - { - var repository = FactoryExtensionsV3.GetCoreV3(Repository.Factory, pinSources[i].Trim()); - _findPackageResources[i] = repository.GetResource(); - } - _provider = provider; - _sourceCacheContext = new SourceCacheContext(); - _logger = logger; - } - - public void Execute() - { - _logger.LogMessage(MessageImportance.High, $"Pinning package references for projects in {_repositoryRoot}"); - - var solutionPinMetadata = GetProjectPinVersionMetadata(); - foreach (var cliToolReference in solutionPinMetadata.CLIToolReferences) - { - _logger.LogMessage(MessageImportance.Normal, $"Pinning CLI Tool {cliToolReference.Item1.Name}({cliToolReference.Item1.VersionRange} to {cliToolReference.Item2} for all projects in {_repositoryRoot}."); - } - - foreach (var item in solutionPinMetadata.PinVersionLookup) - { - var projectPinMetadata = item.Value; - var specProject = projectPinMetadata.PackageSpec; - - if (!(projectPinMetadata.Packages.Any() || solutionPinMetadata.CLIToolReferences.Any())) - { - _logger.LogMessage(MessageImportance.Normal, $"No package or tool references to pin for {specProject.FilePath}."); - continue; - } - - var projectFileInfo = new FileInfo(specProject.FilePath); - var pinnedReferencesFile = Path.Combine( - specProject.RestoreMetadata.OutputPath, - projectFileInfo.Name + ".pinnedversions.targets"); - - Directory.CreateDirectory(Path.GetDirectoryName(pinnedReferencesFile)); - - if (projectPinMetadata.Packages.Any()) - { - _logger.LogMessage(MessageImportance.Normal, $"Pinning package versions for {specProject.FilePath}."); - } - - var pinnedReferences = new XElement("ItemGroup", new XAttribute("Condition", "'$(PolicyDesignTimeBuild)' != 'true' AND !Exists('$(MSBuildThisFileDirectory)$(MSBuildProjectFile).nugetpolicy.g.targets')")); - foreach (var packageReference in projectPinMetadata.Packages) - { - (var tfm, var libraryRange, var exactVersion) = packageReference; - _logger.LogMessage(MessageImportance.Normal, $"Pinning reference {libraryRange.Name}({libraryRange.VersionRange} to {exactVersion}."); - var metadata = new List - { - new XAttribute("Update", libraryRange.Name), - new XAttribute("Version", exactVersion.ToNormalizedString()), - }; - - if (tfm != NuGetFramework.AnyFramework) - { - metadata.Add(new XAttribute("Condition", $"'$(TargetFramework)'=='{tfm.GetShortFolderName()}'")); - } - - pinnedReferences.Add(new XElement("PackageReference", metadata)); - } - - // CLI Tool references are specified at solution level. - foreach (var toolReference in solutionPinMetadata.CLIToolReferences) - { - (var libraryRange, var exactVersion) = toolReference; - var metadata = new List - { - new XAttribute("Update", libraryRange.Name), - new XAttribute("Version", exactVersion.ToNormalizedString()), - }; - - pinnedReferences.Add(new XElement("DotNetCliToolReference", metadata)); - } - - var pinnedVersionRoot = new XElement("Project", pinnedReferences); - File.WriteAllText(pinnedReferencesFile, pinnedVersionRoot.ToString()); - } - } - - private SolutionPinVersionMetadata GetProjectPinVersionMetadata() - { - var repositoryDirectoryInfo = new DirectoryInfo(_repositoryRoot); - var projects = new Dictionary(StringComparer.OrdinalIgnoreCase); - var cliToolReferences = new List<(LibraryRange, NuGetVersion)>(); - - foreach (var slnFile in repositoryDirectoryInfo.EnumerateFiles("*.sln")) - { - var graphSpec = _provider.GetDependencyGraphSpec(repositoryDirectoryInfo.Name, slnFile.FullName); - foreach (var specProject in graphSpec.Projects) - { - if (!projects.TryGetValue(specProject.FilePath, out var pinMetadata)) - { - pinMetadata = new ProjectPinVersionMetadata(specProject); - projects[specProject.FilePath] = pinMetadata; - } - - var allDependencies = specProject.Dependencies.Select(dependency => new { Dependency = dependency, FrameworkName = NuGetFramework.AnyFramework }) - .Concat(specProject.TargetFrameworks.SelectMany(tfm => tfm.Dependencies.Select(dependency => new { Dependency = dependency, tfm.FrameworkName }))) - .Where(d => d.Dependency.LibraryRange.TypeConstraintAllows(LibraryDependencyTarget.Package)); - - foreach (var dependency in allDependencies) - { - var reference = dependency.Dependency; - var versionRange = reference.LibraryRange.VersionRange; - if (!versionRange.IsFloating) - { - continue; - } - - var exactVersion = GetExactVersion(reference.Name, versionRange); - if (exactVersion == null) - { - continue; - } - - var projectStyle = specProject.RestoreMetadata.ProjectStyle; - if (projectStyle == ProjectStyle.PackageReference) - { - pinMetadata.Packages.Add((dependency.FrameworkName, reference.LibraryRange, exactVersion)); - } - else if (projectStyle == ProjectStyle.DotnetCliTool) - { - cliToolReferences.Add((reference.LibraryRange, exactVersion)); - } - else - { - throw new NotSupportedException($"Unknown project style '{projectStyle}'."); - } - } - } - } - - return new SolutionPinVersionMetadata(projects, cliToolReferences); - } - - private NuGetVersion GetExactVersion(string name, VersionRange range) - { - if (range.MinVersion == null) - { - throw new Exception($"Unsupported version range {range}."); - } - - if (!_exactMatches.TryGetValue(name, out var versionTask)) - { - versionTask = _exactMatches.GetOrAdd(name, GetExactVersionAsync(name, range.MinVersion)); - } - - return versionTask.Result; - } - - private async Task GetExactVersionAsync(string name, NuGetVersion floatingVersion) - { - foreach (var findPackageResource in _findPackageResources) - { - var packageVersions = await findPackageResource.GetAllVersionsAsync(name, _sourceCacheContext, NullLogger.Instance, default(CancellationToken)); - - var matchingVersions = packageVersions.Where(v => v.Version == floatingVersion.Version).ToList(); - switch (matchingVersions.Count) - { - case 0: - continue; - case 1: - return matchingVersions[0]; - default: - throw new Exception($"More than one version for {name} found that matches the specified version constraint: {string.Join(" ", matchingVersions)}."); - } - } - - return null; - } - - private struct SolutionPinVersionMetadata - { - public SolutionPinVersionMetadata( - IDictionary pinVersionLookup, - List<(LibraryRange, NuGetVersion)> cliToolReferences) - { - PinVersionLookup = pinVersionLookup; - CLIToolReferences = cliToolReferences; - } - - public IDictionary PinVersionLookup { get; } - - public List<(LibraryRange, NuGetVersion)> CLIToolReferences { get; } - } - - private struct ProjectPinVersionMetadata - { - public ProjectPinVersionMetadata(PackageSpec packageSpec) - { - PackageSpec = packageSpec; - Packages = new List<(NuGetFramework, LibraryRange, NuGetVersion)>(); - } - - public PackageSpec PackageSpec { get; } - - public List<(NuGetFramework, LibraryRange, NuGetVersion)> Packages { get; } - } - } -}