Adding ranges to the source mappings so that we can specify the origin should match this range and migrate to that version. We use this to handle LTS/FTS migration and will use that for the LTS uplift.

This commit is contained in:
Livar Cunha 2017-01-11 19:30:05 -08:00
parent 4319668111
commit 89fba856e8
4 changed files with 227 additions and 59 deletions

View file

@ -6,6 +6,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
internal class ConstantPackageVersions internal class ConstantPackageVersions
{ {
public const string AspNetToolsVersion = "1.0.0-msbuild3-final"; public const string AspNetToolsVersion = "1.0.0-msbuild3-final";
public const string AspNet110ToolsVersion = "1.1.0-msbuild3-final";
public const string TestSdkPackageVersion = "15.0.0-preview-20170106-08"; public const string TestSdkPackageVersion = "15.0.0-preview-20170106-08";
public const string XUnitPackageVersion = "2.2.0-beta4-build3444"; public const string XUnitPackageVersion = "2.2.0-beta4-build3444";
public const string XUnitRunnerPackageVersion = "2.2.0-beta4-build1194"; public const string XUnitRunnerPackageVersion = "2.2.0-beta4-build1194";

View file

@ -26,55 +26,215 @@ namespace Microsoft.DotNet.ProjectJsonMigration
public const string DotnetTestXunit = "dotnet-test-xunit"; public const string DotnetTestXunit = "dotnet-test-xunit";
public const string DotnetTestMSTest = "dotnet-test-mstest"; public const string DotnetTestMSTest = "dotnet-test-mstest";
public static readonly IDictionary<string, PackageDependencyInfo> ProjectDependencyPackages = public static readonly IDictionary<PackageDependencyInfo, PackageDependencyInfo> ProjectDependencyPackages =
new Dictionary<string, PackageDependencyInfo> { new Dictionary<PackageDependencyInfo, PackageDependencyInfo> {
{"Microsoft.EntityFrameworkCore.Tools", new PackageDependencyInfo { {
Name = "Microsoft.EntityFrameworkCore.Tools", new PackageDependencyInfo {
Version = ConstantPackageVersions.AspNetToolsVersion } }, Name = "Microsoft.EntityFrameworkCore.Tools",
{ "Microsoft.AspNetCore.Razor.Tools", null }, Version = "[1.0.0-*,)"
{ "Microsoft.AspNetCore.Razor.Design", null }, },
{ "Microsoft.VisualStudio.Web.CodeGenerators.Mvc", new PackageDependencyInfo { new PackageDependencyInfo {
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design", Name = "Microsoft.EntityFrameworkCore.Tools",
Version = ConstantPackageVersions.AspNetToolsVersion } }, Version = ConstantPackageVersions.AspNetToolsVersion }
{ "Microsoft.VisualStudio.Web.CodeGeneration.Tools", null}, },
{ TestSdkPackageName, new PackageDependencyInfo { {
Name = TestSdkPackageName, new PackageDependencyInfo
Version = ConstantPackageVersions.TestSdkPackageVersion } }, {
{ XUnitPackageName, new PackageDependencyInfo { Name = "Microsoft.AspNetCore.Razor.Tools",
Name = XUnitPackageName, Version = "[1.0.0-*,)"
Version = ConstantPackageVersions.XUnitPackageVersion } }, },
{ XUnitRunnerPackageName, new PackageDependencyInfo { null
Name = XUnitRunnerPackageName, },
Version = ConstantPackageVersions.XUnitRunnerPackageVersion } }, {
{ MstestTestAdapterName, new PackageDependencyInfo { new PackageDependencyInfo
Name = MstestTestAdapterName, {
Version = ConstantPackageVersions.MstestTestAdapterVersion } }, Name = "Microsoft.AspNetCore.Razor.Design",
{ MstestTestFrameworkName, new PackageDependencyInfo { Version = "[1.0.0-*,)"
Name = MstestTestFrameworkName, },
Version = ConstantPackageVersions.MstestTestFrameworkVersion } }, null
{ DotnetTestXunit, null }, },
{ DotnetTestMSTest, null }, // I hate to do this, but ordering here matters. The higher version needs to come first, otherwise
// the lower version mapping will match to it.
{
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGenerators.Mvc",
Version = "[1.1.0-*,)"
},
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design",
Version = ConstantPackageVersions.AspNet110ToolsVersion
}
},
{
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGenerators.Mvc",
Version = "[1.0.0-*,1.1.0)"
},
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Design",
Version = ConstantPackageVersions.AspNetToolsVersion
}
},
{
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools",
Version = "[1.0.0-*,)"
},
null
},
{
new PackageDependencyInfo
{
Name = TestSdkPackageName,
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo
{
Name = TestSdkPackageName,
Version = ConstantPackageVersions.TestSdkPackageVersion
}
},
{
new PackageDependencyInfo
{
Name = XUnitPackageName,
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo
{
Name = XUnitPackageName,
Version = ConstantPackageVersions.XUnitPackageVersion
}
},
{
new PackageDependencyInfo
{
Name = XUnitRunnerPackageName,
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = XUnitRunnerPackageName,
Version = ConstantPackageVersions.XUnitRunnerPackageVersion
}
},
{
new PackageDependencyInfo
{
Name = MstestTestAdapterName,
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo
{
Name = MstestTestAdapterName,
Version = ConstantPackageVersions.MstestTestAdapterVersion
}
},
{
new PackageDependencyInfo
{
Name = MstestTestFrameworkName,
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = MstestTestFrameworkName,
Version = ConstantPackageVersions.MstestTestFrameworkVersion
}
},
{
new PackageDependencyInfo
{
Name = DotnetTestXunit,
Version = "[1.0.0-*,)"
},
null
},
{
new PackageDependencyInfo
{
Name = DotnetTestMSTest,
Version = "[1.0.0-*,)"
},
null
},
}; };
public static readonly IDictionary<string, PackageDependencyInfo> ProjectToolPackages = public static readonly IDictionary<PackageDependencyInfo, PackageDependencyInfo> ProjectToolPackages =
new Dictionary<string, PackageDependencyInfo> { new Dictionary<PackageDependencyInfo, PackageDependencyInfo> {
{"Microsoft.EntityFrameworkCore.Tools", new PackageDependencyInfo { {
Name = "Microsoft.EntityFrameworkCore.Tools.DotNet", new PackageDependencyInfo
Version = ConstantPackageVersions.AspNetToolsVersion } }, {
{ "Microsoft.AspNetCore.Razor.Tools", null }, Name = "Microsoft.EntityFrameworkCore.Tools",
{ "Microsoft.VisualStudio.Web.CodeGeneration.Tools", new PackageDependencyInfo { Version = "[1.0.0-*,)"
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools", },
Version = ConstantPackageVersions.AspNetToolsVersion } }, new PackageDependencyInfo {
{ "Microsoft.DotNet.Watcher.Tools", new PackageDependencyInfo { Name = "Microsoft.EntityFrameworkCore.Tools.DotNet",
Name = "Microsoft.DotNet.Watcher.Tools", Version = ConstantPackageVersions.AspNetToolsVersion
Version = ConstantPackageVersions.AspNetToolsVersion } }, }
{ "Microsoft.Extensions.SecretManager.Tools", new PackageDependencyInfo { },
Name = "Microsoft.Extensions.SecretManager.Tools", {
Version = ConstantPackageVersions.AspNetToolsVersion } }, new PackageDependencyInfo
{ "Microsoft.AspNetCore.Server.IISIntegration.Tools", null}, {
{ "BundlerMinifier.Core", new PackageDependencyInfo { Name = "Microsoft.AspNetCore.Razor.Tools",
Name = "BundlerMinifier.Core", Version = "[1.0.0-*,)"
Version = ConstantPackageVersions.BundleMinifierToolVersion } } },
null
},
{
new PackageDependencyInfo
{
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools",
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = "Microsoft.VisualStudio.Web.CodeGeneration.Tools",
Version = ConstantPackageVersions.AspNetToolsVersion
}
},
{
new PackageDependencyInfo
{
Name = "Microsoft.DotNet.Watcher.Tools",
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = "Microsoft.DotNet.Watcher.Tools",
Version = ConstantPackageVersions.AspNetToolsVersion
}
},
{
new PackageDependencyInfo
{
Name = "Microsoft.Extensions.SecretManager.Tools",
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = "Microsoft.Extensions.SecretManager.Tools",
Version = ConstantPackageVersions.AspNetToolsVersion
}
},
{
new PackageDependencyInfo
{
Name = "Microsoft.AspNetCore.Server.IISIntegration.Tools",
Version = "[1.0.0-*,)"
},
null
},
{
new PackageDependencyInfo{
Name = "BundlerMinifier.Core",
Version = "[1.0.0-*,)"
},
new PackageDependencyInfo {
Name = "BundlerMinifier.Core",
Version = ConstantPackageVersions.BundleMinifierToolVersion
}
}
}; };
} }
} }

View file

@ -13,6 +13,7 @@ using Microsoft.DotNet.Internal.ProjectModel;
using Microsoft.DotNet.Tools.Common; using Microsoft.DotNet.Tools.Common;
using NuGet.Frameworks; using NuGet.Frameworks;
using NuGet.LibraryModel; using NuGet.LibraryModel;
using NuGet.Versioning;
namespace Microsoft.DotNet.ProjectJsonMigration.Rules namespace Microsoft.DotNet.ProjectJsonMigration.Rules
{ {
@ -274,14 +275,17 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
private PackageDependencyInfo ToPackageDependencyInfo( private PackageDependencyInfo ToPackageDependencyInfo(
ProjectLibraryDependency dependency, ProjectLibraryDependency dependency,
IDictionary<string, PackageDependencyInfo> dependencyToVersionMap) IDictionary<PackageDependencyInfo, PackageDependencyInfo> dependencyToVersionMap)
{ {
var name = dependency.Name; var name = dependency.Name;
var version = dependency.LibraryRange?.VersionRange?.OriginalString; var version = dependency.LibraryRange?.VersionRange?.OriginalString;
if (dependencyToVersionMap.ContainsKey(name)) var possibleMappings = dependencyToVersionMap.Where(c => c.Key.Name == name);
if (possibleMappings.Any())
{ {
var dependencyInfo = dependencyToVersionMap[name]; var possibleVersions = possibleMappings.Select(p => VersionRange.Parse(p.Key.Version));
var bestMatchVersion = possibleVersions.First(p => p.Satisfies(dependency.LibraryRange?.VersionRange?.ToNonSnapshotRange().MinVersion));
var dependencyInfo = possibleMappings.First(c => c.Key.Version == bestMatchVersion.OriginalString).Value;
if (dependencyInfo == null) if (dependencyInfo == null)
{ {
return null; return null;

View file

@ -12,19 +12,22 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
public class GivenThatIWantToMigrateTools : PackageDependenciesTestBase public class GivenThatIWantToMigrateTools : PackageDependenciesTestBase
{ {
[Theory] [Theory]
[InlineData("Microsoft.EntityFrameworkCore.Tools", "Microsoft.EntityFrameworkCore.Tools", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("Microsoft.EntityFrameworkCore.Tools", "1.0.0-preview2-final", "Microsoft.EntityFrameworkCore.Tools", ConstantPackageVersions.AspNetToolsVersion)]
[InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-preview2-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)]
public void It_migrates_project_dependencies_to_a_new_name_and_version( [InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-*", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)]
[InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.0.0-preview3-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", ConstantPackageVersions.AspNetToolsVersion)]
[InlineData("Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "1.1.0-preview4-final", "Microsoft.VisualStudio.Web.CodeGeneration.Design", "1.1.0-msbuild3-final")]
public void ItMigratesProjectDependenciesToANewNameAndVersion(
string sourceToolName, string sourceToolName,
string sourceVersion,
string targetToolName, string targetToolName,
string targetVersion) string targetVersion)
{ {
const string anyVersion = "1.0.0-preview2-final"; var mockProj = RunPackageDependenciesRuleOnPj("{ \"dependencies\": { \"" + sourceToolName + "\" : { \"version\": \"" + sourceVersion + "\", \"type\": \"build\" } } }");
var mockProj = RunPackageDependenciesRuleOnPj("{ \"dependencies\": { \"" + sourceToolName + "\" : { \"version\": \"" + anyVersion + "\", \"type\": \"build\" } } }");
var packageRef = mockProj.Items.First(i => i.Include == targetToolName && i.ItemType == "PackageReference"); var packageRef = mockProj.Items.First(i => i.Include == targetToolName && i.ItemType == "PackageReference");
packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion); packageRef.GetMetadataWithName("Version").Value.Should().Be(targetVersion);
packageRef.GetMetadataWithName("PrivateAssets").Value.Should().NotBeNull().And.Be("All"); packageRef.GetMetadataWithName("PrivateAssets").Value.Should().NotBeNull().And.Be("All");
} }
@ -35,7 +38,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
[InlineData("Microsoft.VisualStudio.Web.CodeGeneration.Tools")] [InlineData("Microsoft.VisualStudio.Web.CodeGeneration.Tools")]
[InlineData("dotnet-test-xunit")] [InlineData("dotnet-test-xunit")]
[InlineData("dotnet-test-mstest")] [InlineData("dotnet-test-mstest")]
public void It_does_not_migrate_project_tool_dependency_that_is_no_longer_needed(string dependencyName) public void ItDoesNotMigrateProjectToolDependencyThatIsNoLongerNeeded(string dependencyName)
{ {
var mockProj = RunPackageDependenciesRuleOnPj(@" var mockProj = RunPackageDependenciesRuleOnPj(@"
{ {
@ -59,7 +62,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
[InlineData("Microsoft.DotNet.Watcher.Tools", "Microsoft.DotNet.Watcher.Tools", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("Microsoft.DotNet.Watcher.Tools", "Microsoft.DotNet.Watcher.Tools", ConstantPackageVersions.AspNetToolsVersion)]
[InlineData("Microsoft.Extensions.SecretManager.Tools", "Microsoft.Extensions.SecretManager.Tools", ConstantPackageVersions.AspNetToolsVersion)] [InlineData("Microsoft.Extensions.SecretManager.Tools", "Microsoft.Extensions.SecretManager.Tools", ConstantPackageVersions.AspNetToolsVersion)]
[InlineData("BundlerMinifier.Core", "BundlerMinifier.Core", ConstantPackageVersions.BundleMinifierToolVersion)] [InlineData("BundlerMinifier.Core", "BundlerMinifier.Core", ConstantPackageVersions.BundleMinifierToolVersion)]
public void It_migrates_asp_project_tools_to_a_new_name_and_version( public void ItMigratesAspProjectToolsToANewNameAndVersion(
string sourceToolName, string sourceToolName,
string targetToolName, string targetToolName,
string targetVersion) string targetVersion)
@ -73,7 +76,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
[Theory] [Theory]
[InlineData("Microsoft.AspNetCore.Razor.Tools")] [InlineData("Microsoft.AspNetCore.Razor.Tools")]
[InlineData("Microsoft.AspNetCore.Server.IISIntegration.Tools")] [InlineData("Microsoft.AspNetCore.Server.IISIntegration.Tools")]
public void It_does_not_migrate_asp_project_tool(string toolName) public void ItDoesNotMigrateAspProjectTool(string toolName)
{ {
var mockProj = RunPackageDependenciesRuleOnPj(@" var mockProj = RunPackageDependenciesRuleOnPj(@"
{ {