Adding a map of asp tools packages that tells which versions we need to migrate and to what. Any package in that list, will also have its version updated.

This commit is contained in:
Livar Cunha 2016-10-28 17:22:58 -07:00
parent 5a621b53e2
commit b16c9018b6
6 changed files with 333 additions and 66 deletions

View file

@ -0,0 +1,10 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace Microsoft.DotNet.ProjectJsonMigration
{
internal class ConstantPackageVersions
{
public const string AspNetToolsVersion = "1.0.0-rc1-final";
}
}

View file

@ -1,11 +1,30 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System.Collections.Generic;
namespace Microsoft.DotNet.ProjectJsonMigration
{
internal class PackageConstants
{
public const string SdkPackageName = "Microsoft.NET.Sdk";
public const string WebSdkPackageName = "Microsoft.NET.Sdk.Web";
public static readonly IDictionary<string, string> AspProjectDependencyToolsPackages = new Dictionary<string, string> {
{"Microsoft.EntityFrameworkCore.Tools", "Microsoft.EntityFrameworkCore.Tools"},
{"Microsoft.AspNetCore.Razor.Tools", "Microsoft.AspNetCore.Razor.Design"},
{"Microsoft.AspNetCore.Razor.Design", "Microsoft.AspNetCore.Razor.Design"},
{"Microsoft.VisualStudio.Web.CodeGenerators.Mvc", "Microsoft.VisualStudio.Web.CodGeneration.Design"},
{"Microsoft.VisualStudio.Web.CodeGeneration.Tools", ""},
};
public static readonly IDictionary<string, string> AspProjectToolsPackages = new Dictionary<string, string> {
{"Microsoft.EntityFrameworkCore.Tools", "Microsoft.EntityFrameworkCore.Tools.DotNet"},
{"Microsoft.AspNetCore.Razor.Tools", "Microsoft.AspNetCore.Razor.Tools"},
{"Microsoft.VisualStudio.Web.CodeGeneration.Tools", "Microsoft.VisualStudio.Web.CodGeneration.Tools"},
{"Microsoft.DotNet.Watcher.Tools", "Microsoft.DotNet.Watcher.Tools"},
{"Microsoft.Extensions.SecretManager.Tools", "Microsoft.Extensions.SecretManager.Tools"},
{"Microsoft.AspNetCore.Server.IISIntegration.Tools", ""}
};
}
}

View file

@ -41,7 +41,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
// Inject Sdk dependency
_transformApplicator.Execute(
PackageDependencyInfoTransform.Transform(
SdkPackageDependencyTransform.Transform(
new PackageDependencyInfo
{
Name = PackageConstants.SdkPackageName,
@ -146,7 +146,12 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
foreach (var tool in project.Tools)
{
_transformApplicator.Execute(ToolTransform.Transform(tool), itemGroup, mergeExisting: true);
_transformApplicator.Execute(
ToolTransform().Transform(ToPackageDependencyInfo(
tool,
ConstantPackageNames.AspProjectToolsPackages)),
itemGroup,
mergeExisting: true);
}
}
@ -172,7 +177,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
foreach (var packageDependency in packageDependencies)
{
MigrationTrace.Instance.WriteLine(packageDependency.Name);
AddItemTransform<ProjectLibraryDependency> transform;
AddItemTransform<PackageDependencyInfo> transform;
if (packageDependency.LibraryRange.TypeConstraint == LibraryDependencyTarget.Reference)
{
@ -180,7 +185,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
}
else
{
transform = PackageDependencyTransform();
transform = PackageDependencyInfoTransform();
if (packageDependency.Type.Equals(LibraryDependencyType.Build))
{
transform = transform.WithMetadata("PrivateAssets", "All");
@ -199,12 +204,39 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
}
_transformApplicator.Execute(
transform.Transform(packageDependency),
transform.Transform(ToPackageDependencyInfo(
packageDependency,
ConstantPackageNames.AspProjectDependencyToolsPackages)),
itemGroup,
mergeExisting: true);
}
}
private PackageDependencyInfo ToPackageDependencyInfo(
ProjectLibraryDependency dependency,
IDictionary<string, string> toolsDictionary)
{
var name = dependency.Name;
var version = dependency.LibraryRange?.VersionRange?.OriginalString;
if (toolsDictionary.ContainsKey(name))
{
name = toolsDictionary[name];
version = ConstantPackageVersions.AspNetToolsVersion;
if(string.IsNullOrEmpty(name))
{
return null;
}
}
return new PackageDependencyInfo
{
Name = name,
Version = version
};
}
private void AutoInjectImplicitProjectJsonAssemblyReferences(NuGetFramework framework,
IList<ProjectLibraryDependency> packageDependencies)
{
@ -290,37 +322,32 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
return projectDependencies.Select(p => p.Name).Concat(migratedXProjDependencyNames);
}
private AddItemTransform<ProjectLibraryDependency> FrameworkDependencyTransform =>
new AddItemTransform<ProjectLibraryDependency>(
private AddItemTransform<PackageDependencyInfo> FrameworkDependencyTransform =>
new AddItemTransform<PackageDependencyInfo>(
"Reference",
dep => dep.Name,
dep => "",
dep => true);
private Func<AddItemTransform<ProjectLibraryDependency>> PackageDependencyTransform =>
() => new AddItemTransform<ProjectLibraryDependency>(
private Func<AddItemTransform<PackageDependencyInfo>> PackageDependencyInfoTransform =>
() => new AddItemTransform<PackageDependencyInfo>(
"PackageReference",
dep => dep.Name,
dep => "",
dep => true)
.WithMetadata("Version", r => r.LibraryRange.VersionRange.OriginalString);
dep => dep != null)
.WithMetadata("Version", r => r.Version);
private AddItemTransform<PackageDependencyInfo> PackageDependencyInfoTransform =>
new AddItemTransform<PackageDependencyInfo>(
"PackageReference",
dep => dep.Name,
dep => "",
dep => true)
.WithMetadata("Version", r => r.Version)
private AddItemTransform<PackageDependencyInfo> SdkPackageDependencyTransform =>
PackageDependencyInfoTransform()
.WithMetadata("PrivateAssets", r => r.PrivateAssets, r => !string.IsNullOrEmpty(r.PrivateAssets));
private AddItemTransform<ProjectLibraryDependency> ToolTransform =>
new AddItemTransform<ProjectLibraryDependency>(
private Func<AddItemTransform<PackageDependencyInfo>> ToolTransform =>
() => new AddItemTransform<PackageDependencyInfo>(
"DotNetCliToolReference",
dep => dep.Name,
dep => "",
dep => true)
.WithMetadata("Version", r => r.LibraryRange.VersionRange.OriginalString);
dep => dep != null)
.WithMetadata("Version", r => r.Version);
private AddPropertyTransform<TargetFrameworkInformation> ImportsTransformation =>
new AddPropertyTransform<TargetFrameworkInformation>(

View file

@ -0,0 +1,196 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.DotNet.Tools.Test.Utilities;
using System.Linq;
using Xunit;
using FluentAssertions;
using System;
namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
public class GivenThatIWantToMigrateAspNetTools : PackageDependenciesTestBase
{
[Fact]
public void It_migrates_MicrosoftEntityFrameworkCoreTools_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""dependencies"": {
""Microsoft.EntityFrameworkCore.Tools"" : {
""version"": ""1.0.0-preview2-final"",
""type"": ""build""
}
}
}");
var packageRef = mockProj.Items.First(i => i.Include == "Microsoft.EntityFrameworkCore.Tools" && i.ItemType == "PackageReference");
packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion);
var privateAssetsMetadata = packageRef.GetMetadataWithName("PrivateAssets");
privateAssetsMetadata.Value.Should().NotBeNull();
privateAssetsMetadata.Value.Should().Be("All");
}
[Fact]
public void It_migrates_MicrosoftEntityFrameworkCoreToolsDotNet_tool_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.EntityFrameworkCore.Tools"": ""1.0.0-preview2-final""
}
}");
EmitsToolReferences(mockProj, Tuple.Create("Microsoft.EntityFrameworkCore.Tools.DotNet", ConstantPackageVersions.AspNetToolsVersion));
}
[Fact]
public void It_migrates_MicrosoftAspNetCoreRazorTools_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""dependencies"": {
""Microsoft.AspNetCore.Razor.Tools"" : {
""version"": ""1.0.0-preview2-final"",
""type"": ""build""
}
}
}");
var packageRef = mockProj.Items.First(i => i.Include == "Microsoft.AspNetCore.Razor.Design" && i.ItemType == "PackageReference");
packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion);
var privateAssetsMetadata = packageRef.GetMetadataWithName("PrivateAssets");
privateAssetsMetadata.Value.Should().NotBeNull();
privateAssetsMetadata.Value.Should().Be("All");
}
[Fact]
public void It_migrates_MicrosoftAspNetCoreRazorDesign_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""dependencies"": {
""Microsoft.AspNetCore.Razor.Design"" : {
""version"": ""1.0.0-preview2-final"",
""type"": ""build""
}
}
}");
var packageRef = mockProj.Items.First(i => i.Include == "Microsoft.AspNetCore.Razor.Design" && i.ItemType == "PackageReference");
packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion);
var privateAssetsMetadata = packageRef.GetMetadataWithName("PrivateAssets");
privateAssetsMetadata.Value.Should().NotBeNull();
privateAssetsMetadata.Value.Should().Be("All");
}
[Fact]
public void It_migrates_MicrosoftAspNetCoreRazorTools_tool_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.AspNetCore.Razor.Tools"": ""1.0.0-preview2-final""
}
}");
EmitsToolReferences(mockProj, Tuple.Create("Microsoft.AspNetCore.Razor.Tools", ConstantPackageVersions.AspNetToolsVersion));
}
[Fact]
public void It_migrates_MicrosoftVisualStudioWebCodeGeneratorsMvc_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""dependencies"": {
""Microsoft.VisualStudio.Web.CodeGenerators.Mvc"" : {
""version"": ""1.0.0-preview2-final"",
""type"": ""build""
}
}
}");
var packageRef = mockProj.Items.First(i => i.Include == "Microsoft.VisualStudio.Web.CodGeneration.Design" && i.ItemType == "PackageReference");
packageRef.GetMetadataWithName("Version").Value.Should().Be(ConstantPackageVersions.AspNetToolsVersion);
var privateAssetsMetadata = packageRef.GetMetadataWithName("PrivateAssets");
privateAssetsMetadata.Value.Should().NotBeNull();
privateAssetsMetadata.Value.Should().Be("All");
}
[Fact]
public void It_does_not_migrate_MicrosoftVisualStudioWebCodeGenerationTools()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""dependencies"": {
""Microsoft.VisualStudio.Web.CodeGeneration.Tools"" : {
""version"": ""1.0.0-preview2-final"",
""type"": ""build""
}
}
}");
var packageRef = mockProj.Items.Where(i => i.Include != "Microsoft.NET.Sdk" && i.ItemType == "PackageReference").Should().BeEmpty();
}
[Fact]
public void It_migrates_MicrosoftVisualStudioWebCodeGenerationTools_tool_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.VisualStudio.Web.CodeGeneration.Tools"": ""1.0.0-preview2-final""
}
}");
EmitsToolReferences(mockProj, Tuple.Create("Microsoft.VisualStudio.Web.CodGeneration.Tools", ConstantPackageVersions.AspNetToolsVersion));
}
[Fact]
public void It_migrates_MicrosoftDotNetWatcherTools_tool_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.DotNet.Watcher.Tools"": ""1.0.0-preview2-final""
}
}");
EmitsToolReferences(mockProj, Tuple.Create("Microsoft.DotNet.Watcher.Tools", ConstantPackageVersions.AspNetToolsVersion));
}
[Fact]
public void It_migrates_MicrosoftExtensionsSecretManagerTools_tool_to_AspNetToolsVersion()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.Extensions.SecretManager.Tools"": ""1.0.0-preview2-final""
}
}");
EmitsToolReferences(mockProj, Tuple.Create("Microsoft.Extensions.SecretManager.Tools", ConstantPackageVersions.AspNetToolsVersion));
}
[Fact]
public void It_does_not_migrate_MicrosoftAspNetCoreServerIISIntegrationTools()
{
var mockProj = RunPackageDependenciesRuleOnPj(@"
{
""tools"": {
""Microsoft.AspNetCore.Server.IISIntegration.Tools"": ""1.0.0-preview2-final""
}
}");
var packageRef = mockProj.Items.Where(i => i.ItemType == "DotNetCliToolReference").Should().BeEmpty();
}
}
}

View file

@ -12,7 +12,7 @@ using System;
namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
public class GivenThatIWantToMigratePackageDependencies : TestBase
public class GivenThatIWantToMigratePackageDependencies : PackageDependenciesTestBase
{
[Fact]
public void It_migrates_basic_PackageReference()
@ -257,48 +257,5 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
items = itemGroup.First().Items.ToArray();
items[0].Include.Should().Be("System");
}
private void EmitsPackageReferences(ProjectRootElement mockProj, params Tuple<string, string, string>[] packageSpecs)
{
foreach (var packageSpec in packageSpecs)
{
var packageName = packageSpec.Item1;
var packageVersion = packageSpec.Item2;
var packageTFM = packageSpec.Item3;
var items = mockProj.Items
.Where(i => i.ItemType == "PackageReference")
.Where(i => string.IsNullOrEmpty(packageTFM) || i.ConditionChain().Any(c => c.Contains(packageTFM)))
.Where(i => i.Include == packageName)
.Where(i => i.GetMetadataWithName("Version").Value == packageVersion);
items.Should().HaveCount(1);
}
}
private void EmitsToolReferences(ProjectRootElement mockProj, params Tuple<string, string>[] toolSpecs)
{
foreach (var toolSpec in toolSpecs)
{
var packageName = toolSpec.Item1;
var packageVersion = toolSpec.Item2;
var items = mockProj.Items
.Where(i => i.ItemType == "DotNetCliToolReference")
.Where(i => i.Include == packageName)
.Where(i => i.GetMetadataWithName("Version").Value == packageVersion);
items.Should().HaveCount(1);
}
}
private ProjectRootElement RunPackageDependenciesRuleOnPj(string s, string testDirectory = null)
{
testDirectory = testDirectory ?? Temp.CreateDirectory().Path;
return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{
new MigratePackageDependenciesAndToolsRule()
}, s, testDirectory);
}
}
}

View file

@ -0,0 +1,58 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using Microsoft.Build.Construction;
using Microsoft.DotNet.Tools.Test.Utilities;
using System.Linq;
using FluentAssertions;
using Microsoft.DotNet.ProjectJsonMigration.Rules;
using System;
namespace Microsoft.DotNet.ProjectJsonMigration.Tests
{
public class PackageDependenciesTestBase : TestBase
{
protected void EmitsPackageReferences(ProjectRootElement mockProj, params Tuple<string, string, string>[] packageSpecs)
{
foreach (var packageSpec in packageSpecs)
{
var packageName = packageSpec.Item1;
var packageVersion = packageSpec.Item2;
var packageTFM = packageSpec.Item3;
var items = mockProj.Items
.Where(i => i.ItemType == "PackageReference")
.Where(i => string.IsNullOrEmpty(packageTFM) || i.ConditionChain().Any(c => c.Contains(packageTFM)))
.Where(i => i.Include == packageName)
.Where(i => i.GetMetadataWithName("Version").Value == packageVersion);
items.Should().HaveCount(1);
}
}
protected void EmitsToolReferences(ProjectRootElement mockProj, params Tuple<string, string>[] toolSpecs)
{
foreach (var toolSpec in toolSpecs)
{
var packageName = toolSpec.Item1;
var packageVersion = toolSpec.Item2;
var items = mockProj.Items
.Where(i => i.ItemType == "DotNetCliToolReference")
.Where(i => i.Include == packageName)
.Where(i => i.GetMetadataWithName("Version").Value == packageVersion);
items.Should().HaveCount(1);
}
}
protected ProjectRootElement RunPackageDependenciesRuleOnPj(string s, string testDirectory = null)
{
testDirectory = testDirectory ?? Temp.CreateDirectory().Path;
return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{
new MigratePackageDependenciesAndToolsRule()
}, s, testDirectory);
}
}
}