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 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(
|
||||
|
|
|
@ -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'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue