diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs b/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs index 32412df03..6fd2db4f7 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs @@ -16,7 +16,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration new MigrateRuntimeOptionsRule(), new MigratePublishOptionsRule(), new MigrateProjectDependenciesRule(), - new MigratePackageDependenciesRule(), + new MigratePackageDependenciesAndToolsRule(), new MigrateConfigurationsRule(), new MigrateScriptsRule(), new WorkaroundOptionsRule(), diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs similarity index 90% rename from src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesRule.cs rename to src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs index a619a40ea..a637dcc5a 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesRule.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePackageDependenciesAndToolsRule.cs @@ -16,13 +16,13 @@ using NuGet.LibraryModel; namespace Microsoft.DotNet.ProjectJsonMigration.Rules { - public class MigratePackageDependenciesRule : IMigrationRule + public class MigratePackageDependenciesAndToolsRule : IMigrationRule { private readonly ITransformApplicator _transformApplicator; private readonly ProjectDependencyFinder _projectDependencyFinder; private string _projectDirectory; - public MigratePackageDependenciesRule(ITransformApplicator transformApplicator = null) + public MigratePackageDependenciesAndToolsRule(ITransformApplicator transformApplicator = null) { _transformApplicator = transformApplicator ?? new TransformApplicator(); _projectDependencyFinder = new ProjectDependencyFinder(); @@ -69,6 +69,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules targetFramework.Dependencies, migrationRuleInputs.ProjectXproj); } + + // Tools + MigrateTools(project, migrationRuleInputs.OutputMSBuildProject); } private void MigrateImports(ProjectItemGroupElement commonItemGroup, TargetFrameworkInformation targetFramework) @@ -93,6 +96,23 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules } } + private void MigrateTools( + Project project, + ProjectRootElement output) + { + if (project.Tools == null || !project.Tools.Any()) + { + return; + } + + var itemGroup = output.AddItemGroup(); + + foreach (var tool in project.Tools) + { + _transformApplicator.Execute(ToolTransform.Transform(tool), itemGroup); + } + } + private void MigrateDependencies( Project project, ProjectRootElement output, @@ -212,6 +232,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules dep => true) .WithMetadata("Version", r => r.Version); + private AddItemTransform ToolTransform => new AddItemTransform( + "DotNetCliToolsReference", + dep => dep.Name, + dep => "", + dep => true) + .WithMetadata("Version", r => r.LibraryRange.VersionRange.OriginalString); + private AddItemTransform ImportsTransformation => new AddItemTransform( "PackageTargetFallback", t => $"$(PackageTargetFallback);{string.Join(";", t.Imports)}", diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs index 69e80302a..a4562cbad 100644 --- a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigratePackageDependencies.cs @@ -23,12 +23,24 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests ""BPackage"" : ""1.0.0"" } }"); - - Console.WriteLine(mockProj.RawXml); EmitsPackageReferences(mockProj, Tuple.Create("APackage", "1.0.0-preview", ""), Tuple.Create("BPackage", "1.0.0", "")); } + [Fact] + public void It_migrates_Tools() + { + var mockProj = RunPackageDependenciesRuleOnPj(@" + { + ""tools"": { + ""APackage"" : ""1.0.0-preview"", + ""BPackage"" : ""1.0.0"" + } + }"); + + EmitsToolReferences(mockProj, Tuple.Create("APackage", "1.0.0-preview"), Tuple.Create("BPackage", "1.0.0")); + } + private void EmitsPackageReferences(ProjectRootElement mockProj, params Tuple[] packageSpecs) { foreach (var packageSpec in packageSpecs) @@ -47,12 +59,28 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests } } + private void EmitsToolReferences(ProjectRootElement mockProj, params Tuple[] toolSpecs) + { + foreach (var toolSpec in toolSpecs) + { + var packageName = toolSpec.Item1; + var packageVersion = toolSpec.Item2; + + var items = mockProj.Items + .Where(i => i.ItemType == "DotNetCliToolsReference") + .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 MigratePackageDependenciesRule() + new MigratePackageDependenciesAndToolsRule() }, s, testDirectory); } }