add support for conditioned csproj references, add tests

This commit is contained in:
Bryan Thornbury 2016-09-22 12:51:23 -07:00
parent a688885f21
commit 3e6e1ddcd0
2 changed files with 129 additions and 27 deletions

View file

@ -37,7 +37,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs);
var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p));
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
MigrateProjectJsonProjectDependencies(
possibleProjectDependencies,
@ -46,14 +45,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
migrationRuleInputs.OutputMSBuildProject);
}
private void ThrowIfUnresolvedDependencies(IEnumerable<ProjectContext> projectContexts, List<ProjectDependency> projectDependencies, IEnumerable<string> migratedXProjDependencyNames)
{
foreach (var projectContext in projectContexts)
{
var projectExports = projectContext.CreateExporter("_").GetDependencies(LibraryType.Project);
}
}
private IEnumerable<string> MigrateXProjProjectDependencies(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs)
{
var xproj = migrationRuleInputs.ProjectXproj;
@ -63,26 +54,38 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
return Enumerable.Empty<string>();
}
var projectReferenceItems = xproj.Items.Where(i => i.ItemType == "ProjectReference");
IEnumerable<string> projectReferences = new List<string>();
foreach (var projectReferenceItem in projectReferenceItems)
var csprojTransformedReferences = new List<ProjectItemElement>();
var csprojReferenceItems = xproj.Items
.Where(i => i.ItemType == "ProjectReference")
.Where(p =>
p.Includes().Any(
include => string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase)));
foreach (var csprojReferenceItem in csprojReferenceItems)
{
projectReferences = projectReferences.Union(projectReferenceItem.Includes());
var conditionChain = csprojReferenceItem.ConditionChain();
var condition = string.Join(" and ", conditionChain);
var referenceInclude = string.Join(";", csprojReferenceItem.Includes()
.Where(include =>
string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase)));
var transformItem = ProjectDependencyStringTransform.Transform(referenceInclude);
transformItem.Condition = condition;
csprojTransformedReferences.Add(transformItem);
}
MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: Migrating {csprojTransformedReferences.Count()} xproj to csproj references");
foreach (var csprojTransformedReference in csprojTransformedReferences)
{
_transformApplicator.Execute(csprojTransformedReference, migrationRuleInputs.CommonItemGroup);
}
var csprojReferences = projectReferences
.Where(p => string.Equals(Path.GetExtension(p), ".csproj", StringComparison.OrdinalIgnoreCase));
MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: Migrating {csprojReferences.Count()} xproj to csproj references");
var csprojReferenceTransforms = csprojReferences.Select(r => ProjectDependencyStringTransform.Transform(r));
foreach (var csprojReferenceTransform in csprojReferenceTransforms)
{
_transformApplicator.Execute(csprojReferenceTransform, migrationRuleInputs.CommonItemGroup);
}
return csprojReferences;
return csprojTransformedReferences.SelectMany(r => r.Includes());
}
public void MigrateProjectJsonProjectDependencies(

View file

@ -104,7 +104,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
}
}
";
Console.WriteLine(projectJson);
var testDirectory = Temp.CreateDirectory().Path;
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
@ -116,5 +115,105 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
migratedProjectReferenceItems.Should().HaveCount(expectedMigratedReferences.Length);
migratedProjectReferenceItems.Select(m => m.Include).Should().BeEquivalentTo(expectedMigratedReferences);
}
public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference()
{
var projectReference = "some/to.csproj";
var xproj = ProjectRootElement.Create();
var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference);
csprojReferenceItem.Condition = " '$(Foo)' == 'bar' ";
var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference);
var projectJson = @"
{
""dependencies"": {" +
$"\"{projectReferenceName}\"" + @": {
""target"" : ""project""
}
}
}
";
var testDirectory = Temp.CreateDirectory().Path;
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{
new MigrateProjectDependenciesRule()
}, projectJson, testDirectory, xproj);
var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference");
migratedProjectReferenceItems.Should().HaveCount(1);
var migratedProjectReferenceItem = migratedProjectReferenceItems.First();
migratedProjectReferenceItem.Include.Should().Be(projectReference);
migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' ");
}
public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference_parent()
{
var projectReference = "some/to.csproj";
var xproj = ProjectRootElement.Create();
var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference);
csprojReferenceItem.Parent.Condition = " '$(Foo)' == 'bar' ";
var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference);
var projectJson = @"
{
""dependencies"": {" +
$"\"{projectReferenceName}\"" + @": {
""target"" : ""project""
}
}
}
";
var testDirectory = Temp.CreateDirectory().Path;
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{
new MigrateProjectDependenciesRule()
}, projectJson, testDirectory, xproj);
var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference");
migratedProjectReferenceItems.Should().HaveCount(1);
var migratedProjectReferenceItem = migratedProjectReferenceItems.First();
migratedProjectReferenceItem.Include.Should().Be(projectReference);
migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' ");
}
public void It_migrates_csproj_ProjectReference_in_xproj_including_condition_on_ProjectReference_parent_and_item()
{
var projectReference = "some/to.csproj";
var xproj = ProjectRootElement.Create();
var csprojReferenceItem = xproj.AddItem("ProjectReference", projectReference);
csprojReferenceItem.Parent.Condition = " '$(Foo)' == 'bar' ";
csprojReferenceItem.Condition = " '$(Bar)' == 'foo' ";
var projectReferenceName = Path.GetFileNameWithoutExtension(projectReference);
var projectJson = @"
{
""dependencies"": {" +
$"\"{projectReferenceName}\"" + @": {
""target"" : ""project""
}
}
}
";
var testDirectory = Temp.CreateDirectory().Path;
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
{
new MigrateProjectDependenciesRule()
}, projectJson, testDirectory, xproj);
var migratedProjectReferenceItems = migratedProj.Items.Where(i => i.ItemType == "ProjectReference");
migratedProjectReferenceItems.Should().HaveCount(1);
var migratedProjectReferenceItem = migratedProjectReferenceItems.First();
migratedProjectReferenceItem.Include.Should().Be(projectReference);
migratedProjectReferenceItem.Condition.Should().Be(" '$(Foo)' == 'bar' and '$(Bar)' == 'foo'");
}
}
}