add support for conditioned csproj references, add tests
This commit is contained in:
parent
a688885f21
commit
3e6e1ddcd0
2 changed files with 129 additions and 27 deletions
|
@ -37,7 +37,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
|
||||||
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs);
|
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs);
|
||||||
var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p));
|
var migratedXProjDependencyNames = migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p));
|
||||||
|
|
||||||
|
|
||||||
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
|
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
|
||||||
MigrateProjectJsonProjectDependencies(
|
MigrateProjectJsonProjectDependencies(
|
||||||
possibleProjectDependencies,
|
possibleProjectDependencies,
|
||||||
|
@ -46,14 +45,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
|
||||||
migrationRuleInputs.OutputMSBuildProject);
|
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)
|
private IEnumerable<string> MigrateXProjProjectDependencies(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs)
|
||||||
{
|
{
|
||||||
var xproj = migrationRuleInputs.ProjectXproj;
|
var xproj = migrationRuleInputs.ProjectXproj;
|
||||||
|
@ -63,26 +54,38 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Rules
|
||||||
return Enumerable.Empty<string>();
|
return Enumerable.Empty<string>();
|
||||||
}
|
}
|
||||||
|
|
||||||
var projectReferenceItems = xproj.Items.Where(i => i.ItemType == "ProjectReference");
|
var csprojTransformedReferences = new List<ProjectItemElement>();
|
||||||
|
|
||||||
IEnumerable<string> projectReferences = new List<string>();
|
var csprojReferenceItems = xproj.Items
|
||||||
foreach (var projectReferenceItem in projectReferenceItems)
|
.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
|
return csprojTransformedReferences.SelectMany(r => r.Includes());
|
||||||
.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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MigrateProjectJsonProjectDependencies(
|
public void MigrateProjectJsonProjectDependencies(
|
||||||
|
|
|
@ -104,7 +104,6 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
";
|
";
|
||||||
Console.WriteLine(projectJson);
|
|
||||||
|
|
||||||
var testDirectory = Temp.CreateDirectory().Path;
|
var testDirectory = Temp.CreateDirectory().Path;
|
||||||
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
|
var migratedProj = TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[]
|
||||||
|
@ -116,5 +115,105 @@ namespace Microsoft.DotNet.ProjectJsonMigration.Tests
|
||||||
migratedProjectReferenceItems.Should().HaveCount(expectedMigratedReferences.Length);
|
migratedProjectReferenceItems.Should().HaveCount(expectedMigratedReferences.Length);
|
||||||
migratedProjectReferenceItems.Select(m => m.Include).Should().BeEquivalentTo(expectedMigratedReferences);
|
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'");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue