Merge pull request #4320 from brthor/brthor/toolsrefmigration

dotnet cli migrate tools ref
This commit is contained in:
Bryan Thornbury 2016-10-05 13:39:34 -07:00 committed by GitHub
commit 50e83b9c65
3 changed files with 61 additions and 6 deletions

View file

@ -16,7 +16,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration
new MigrateRuntimeOptionsRule(), new MigrateRuntimeOptionsRule(),
new MigratePublishOptionsRule(), new MigratePublishOptionsRule(),
new MigrateProjectDependenciesRule(), new MigrateProjectDependenciesRule(),
new MigratePackageDependenciesRule(), new MigratePackageDependenciesAndToolsRule(),
new MigrateConfigurationsRule(), new MigrateConfigurationsRule(),
new MigrateScriptsRule(), new MigrateScriptsRule(),
new WorkaroundOptionsRule(), new WorkaroundOptionsRule(),

View file

@ -16,13 +16,13 @@ using NuGet.LibraryModel;
namespace Microsoft.DotNet.ProjectJsonMigration.Rules namespace Microsoft.DotNet.ProjectJsonMigration.Rules
{ {
public class MigratePackageDependenciesRule : IMigrationRule public class MigratePackageDependenciesAndToolsRule : IMigrationRule
{ {
private readonly ITransformApplicator _transformApplicator; private readonly ITransformApplicator _transformApplicator;
private readonly ProjectDependencyFinder _projectDependencyFinder; private readonly ProjectDependencyFinder _projectDependencyFinder;
private string _projectDirectory; private string _projectDirectory;
public MigratePackageDependenciesRule(ITransformApplicator transformApplicator = null) public MigratePackageDependenciesAndToolsRule(ITransformApplicator transformApplicator = null)
{ {
_transformApplicator = transformApplicator ?? new TransformApplicator(); _transformApplicator = transformApplicator ?? new TransformApplicator();
_projectDependencyFinder = new ProjectDependencyFinder(); _projectDependencyFinder = new ProjectDependencyFinder();
@ -69,6 +69,9 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
targetFramework.Dependencies, targetFramework.Dependencies,
migrationRuleInputs.ProjectXproj); migrationRuleInputs.ProjectXproj);
} }
// Tools
MigrateTools(project, migrationRuleInputs.OutputMSBuildProject);
} }
private void MigrateImports(ProjectItemGroupElement commonItemGroup, TargetFrameworkInformation targetFramework) 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( private void MigrateDependencies(
Project project, Project project,
ProjectRootElement output, ProjectRootElement output,
@ -212,6 +232,13 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
dep => true) dep => true)
.WithMetadata("Version", r => r.Version); .WithMetadata("Version", r => r.Version);
private AddItemTransform<ProjectLibraryDependency> ToolTransform => new AddItemTransform<ProjectLibraryDependency>(
"DotNetCliToolsReference",
dep => dep.Name,
dep => "",
dep => true)
.WithMetadata("Version", r => r.LibraryRange.VersionRange.OriginalString);
private AddItemTransform<TargetFrameworkInformation> ImportsTransformation => new AddItemTransform<TargetFrameworkInformation>( private AddItemTransform<TargetFrameworkInformation> ImportsTransformation => new AddItemTransform<TargetFrameworkInformation>(
"PackageTargetFallback", "PackageTargetFallback",
t => $"$(PackageTargetFallback);{string.Join(";", t.Imports)}", t => $"$(PackageTargetFallback);{string.Join(";", t.Imports)}",

View file

@ -23,12 +23,24 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
""BPackage"" : ""1.0.0"" ""BPackage"" : ""1.0.0""
} }
}"); }");
Console.WriteLine(mockProj.RawXml);
EmitsPackageReferences(mockProj, Tuple.Create("APackage", "1.0.0-preview", ""), Tuple.Create("BPackage", "1.0.0", "")); 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<string, string, string>[] packageSpecs) private void EmitsPackageReferences(ProjectRootElement mockProj, params Tuple<string, string, string>[] packageSpecs)
{ {
foreach (var packageSpec in packageSpecs) foreach (var packageSpec in packageSpecs)
@ -47,12 +59,28 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
} }
} }
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 == "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) private ProjectRootElement RunPackageDependenciesRuleOnPj(string s, string testDirectory = null)
{ {
testDirectory = testDirectory ?? Temp.CreateDirectory().Path; testDirectory = testDirectory ?? Temp.CreateDirectory().Path;
return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{ {
new MigratePackageDependenciesRule() new MigratePackageDependenciesAndToolsRule()
}, s, testDirectory); }, s, testDirectory);
} }
} }