Pin CLI tool references for all projects in a solution
This commit is contained in:
parent
97fd4f432b
commit
cd11f71428
|
|
@ -40,13 +40,18 @@ namespace PinVersions
|
||||||
|
|
||||||
public void Execute()
|
public void Execute()
|
||||||
{
|
{
|
||||||
var solutionPinMetadata = GetPinVersionMetadata();
|
var solutionPinMetadata = GetProjectPinVersionMetadata();
|
||||||
foreach (var item in solutionPinMetadata)
|
foreach (var cliToolReference in solutionPinMetadata.CLIToolReferences)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"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 projectPinMetadata = item.Value;
|
||||||
var specProject = projectPinMetadata.PackageSpec;
|
var specProject = projectPinMetadata.PackageSpec;
|
||||||
|
|
||||||
if (!(projectPinMetadata.Packages.Any() || projectPinMetadata.CLIToolReferences.Any()))
|
if (!(projectPinMetadata.Packages.Any() || solutionPinMetadata.CLIToolReferences.Any()))
|
||||||
{
|
{
|
||||||
Console.WriteLine($"No package or tool references to pin for {specProject.FilePath}.");
|
Console.WriteLine($"No package or tool references to pin for {specProject.FilePath}.");
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -59,7 +64,11 @@ namespace PinVersions
|
||||||
|
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(pinnedReferencesFile));
|
Directory.CreateDirectory(Path.GetDirectoryName(pinnedReferencesFile));
|
||||||
|
|
||||||
Console.WriteLine($"Pinning package versions for {specProject.FilePath}.");
|
if (projectPinMetadata.Packages.Any())
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Pinning package versions for {specProject.FilePath}.");
|
||||||
|
}
|
||||||
|
|
||||||
var pinnedReferences = new XElement("ItemGroup");
|
var pinnedReferences = new XElement("ItemGroup");
|
||||||
foreach (var packageReference in projectPinMetadata.Packages)
|
foreach (var packageReference in projectPinMetadata.Packages)
|
||||||
{
|
{
|
||||||
|
|
@ -79,10 +88,10 @@ namespace PinVersions
|
||||||
pinnedReferences.Add(new XElement("PackageReference", metadata));
|
pinnedReferences.Add(new XElement("PackageReference", metadata));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var toolReference in projectPinMetadata.CLIToolReferences)
|
// CLI Tool references are specified at solution level.
|
||||||
|
foreach (var toolReference in solutionPinMetadata.CLIToolReferences)
|
||||||
{
|
{
|
||||||
(var libraryRange, var exactVersion) = toolReference;
|
(var libraryRange, var exactVersion) = toolReference;
|
||||||
Console.WriteLine($"Pinning CLI Tool {libraryRange.Name}({libraryRange.VersionRange} to {exactVersion}.");
|
|
||||||
var metadata = new List<XAttribute>
|
var metadata = new List<XAttribute>
|
||||||
{
|
{
|
||||||
new XAttribute("Update", libraryRange.Name),
|
new XAttribute("Update", libraryRange.Name),
|
||||||
|
|
@ -97,10 +106,11 @@ namespace PinVersions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IDictionary<string, PinVersionMetadata> GetPinVersionMetadata()
|
private SolutionPinVersionMetadata GetProjectPinVersionMetadata()
|
||||||
{
|
{
|
||||||
var repositoryDirectoryInfo = new DirectoryInfo(_repositoryRoot);
|
var repositoryDirectoryInfo = new DirectoryInfo(_repositoryRoot);
|
||||||
var projects = new Dictionary<string, PinVersionMetadata>(StringComparer.OrdinalIgnoreCase);
|
var projects = new Dictionary<string, ProjectPinVersionMetadata>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
var cliToolReferences = new List<(LibraryRange, NuGetVersion)>();
|
||||||
|
|
||||||
foreach (var slnFile in repositoryDirectoryInfo.EnumerateFiles("*.sln"))
|
foreach (var slnFile in repositoryDirectoryInfo.EnumerateFiles("*.sln"))
|
||||||
{
|
{
|
||||||
|
|
@ -109,7 +119,7 @@ namespace PinVersions
|
||||||
{
|
{
|
||||||
if (!projects.TryGetValue(specProject.FilePath, out var pinMetadata))
|
if (!projects.TryGetValue(specProject.FilePath, out var pinMetadata))
|
||||||
{
|
{
|
||||||
pinMetadata = new PinVersionMetadata(specProject);
|
pinMetadata = new ProjectPinVersionMetadata(specProject);
|
||||||
projects[specProject.FilePath] = pinMetadata;
|
projects[specProject.FilePath] = pinMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -139,7 +149,7 @@ namespace PinVersions
|
||||||
}
|
}
|
||||||
else if (projectStyle == ProjectStyle.DotnetCliTool)
|
else if (projectStyle == ProjectStyle.DotnetCliTool)
|
||||||
{
|
{
|
||||||
pinMetadata.CLIToolReferences.Add((reference.LibraryRange, exactVersion));
|
cliToolReferences.Add((reference.LibraryRange, exactVersion));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -149,7 +159,7 @@ namespace PinVersions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return projects;
|
return new SolutionPinVersionMetadata(projects, cliToolReferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
private NuGetVersion GetExactVersion(string name, VersionRange range)
|
private NuGetVersion GetExactVersion(string name, VersionRange range)
|
||||||
|
|
@ -188,20 +198,32 @@ namespace PinVersions
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct PinVersionMetadata
|
private struct SolutionPinVersionMetadata
|
||||||
{
|
{
|
||||||
public PinVersionMetadata(PackageSpec packageSpec)
|
public SolutionPinVersionMetadata(
|
||||||
|
IDictionary<string, ProjectPinVersionMetadata> pinVersionLookup,
|
||||||
|
List<(LibraryRange, NuGetVersion)> cliToolReferences)
|
||||||
|
{
|
||||||
|
PinVersionLookup = pinVersionLookup;
|
||||||
|
CLIToolReferences = cliToolReferences;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IDictionary<string, ProjectPinVersionMetadata> PinVersionLookup { get; }
|
||||||
|
|
||||||
|
public List<(LibraryRange, NuGetVersion)> CLIToolReferences { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct ProjectPinVersionMetadata
|
||||||
|
{
|
||||||
|
public ProjectPinVersionMetadata(PackageSpec packageSpec)
|
||||||
{
|
{
|
||||||
PackageSpec = packageSpec;
|
PackageSpec = packageSpec;
|
||||||
Packages = new List<(NuGetFramework, LibraryRange, NuGetVersion)>();
|
Packages = new List<(NuGetFramework, LibraryRange, NuGetVersion)>();
|
||||||
CLIToolReferences = new List<(LibraryRange, NuGetVersion)>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public PackageSpec PackageSpec { get; }
|
public PackageSpec PackageSpec { get; }
|
||||||
|
|
||||||
public List<(NuGetFramework, LibraryRange, NuGetVersion)> Packages { get; }
|
public List<(NuGetFramework, LibraryRange, NuGetVersion)> Packages { get; }
|
||||||
|
|
||||||
public List<(LibraryRange, NuGetVersion)> CLIToolReferences { get; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue