Skip to content
This repository was archived by the owner on Apr 20, 2023. It is now read-only.

Commit 4a7ed87

Browse files
committed
Address PR Feedback
1 parent b0565e6 commit 4a7ed87

File tree

3 files changed

+64
-38
lines changed

3 files changed

+64
-38
lines changed

src/Microsoft.DotNet.ProjectJsonMigration/ProjectDependencyFinder.cs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using Microsoft.Build.Construction;
67
using Microsoft.DotNet.ProjectModel;
78
using System.Linq;
89
using System.IO;
@@ -14,18 +15,32 @@ namespace Microsoft.DotNet.ProjectJsonMigration
1415
{
1516
public class ProjectDependencyFinder
1617
{
17-
public IEnumerable<ProjectDependency> ResolveProjectDependencies(IEnumerable<ProjectContext> projectContexts)
18+
public IEnumerable<ProjectDependency> ResolveProjectDependencies(string projectDir, string xprojFile = null)
19+
{
20+
var projectContexts = ProjectContext.CreateContextForEachFramework(projectDir);
21+
xprojFile = xprojFile ?? FindXprojFile(projectDir);
22+
23+
ProjectRootElement xproj = null;
24+
if (xprojFile != null)
25+
{
26+
xproj = ProjectRootElement.Open(xprojFile);
27+
}
28+
29+
return ResolveProjectDependencies(projectContexts, ResolveXProjProjectDependencyNames(xproj));
30+
}
31+
32+
public IEnumerable<ProjectDependency> ResolveProjectDependencies(IEnumerable<ProjectContext> projectContexts, IEnumerable<string> preResolvedProjects=null)
1833
{
1934
foreach(var projectContext in projectContexts)
2035
{
21-
foreach(var projectDependency in ResolveProjectDependencies(projectContext))
36+
foreach(var projectDependency in ResolveProjectDependencies(projectContext, preResolvedProjects))
2237
{
2338
yield return projectDependency;
2439
}
2540
}
2641
}
2742

28-
public IEnumerable<ProjectDependency> ResolveProjectDependencies(ProjectContext projectContext, HashSet<string> preResolvedProjects=null)
43+
public IEnumerable<ProjectDependency> ResolveProjectDependencies(ProjectContext projectContext, IEnumerable<string> preResolvedProjects=null)
2944
{
3045
preResolvedProjects = preResolvedProjects ?? new HashSet<string>();
3146

@@ -59,6 +74,40 @@ public IEnumerable<ProjectDependency> ResolveProjectDependencies(ProjectContext
5974
return projectDependencies;
6075
}
6176

77+
private IEnumerable<string> ResolveXProjProjectDependencyNames(ProjectRootElement xproj)
78+
{
79+
var xprojDependencies = ResolveXProjProjectDependencies(xproj).SelectMany(r => r.Includes());
80+
return new HashSet<string>(xprojDependencies.Select(p => Path.GetFileNameWithoutExtension(p)));
81+
}
82+
83+
internal IEnumerable<ProjectItemElement> ResolveXProjProjectDependencies(ProjectRootElement xproj)
84+
{
85+
if (xproj == null)
86+
{
87+
MigrationTrace.Instance.WriteLine($"{nameof(ProjectDependencyFinder)}: No xproj file given.");
88+
return Enumerable.Empty<ProjectItemElement>();
89+
}
90+
91+
return xproj.Items
92+
.Where(i => i.ItemType == "ProjectReference")
93+
.Where(p => p.Includes().Any(
94+
include => string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase)));
95+
}
96+
97+
internal string FindXprojFile(string projectDirectory)
98+
{
99+
var allXprojFiles = Directory.EnumerateFiles(projectDirectory, "*.xproj", SearchOption.TopDirectoryOnly);
100+
101+
if (allXprojFiles.Count() > 1)
102+
{
103+
MigrationErrorCodes
104+
.MIGRATE1017($"Multiple xproj files found in {projectDirectory}, please specify which to use")
105+
.Throw();
106+
}
107+
108+
return allXprojFiles.FirstOrDefault();
109+
}
110+
62111
private Dictionary<string, ProjectDependency> FindPossibleProjectDependencies(string projectJsonFilePath)
63112
{
64113
var projectRootDirectory = GetRootFromProjectJson(projectJsonFilePath);

src/Microsoft.DotNet.ProjectJsonMigration/ProjectMigrator.cs

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void Migrate(MigrationSettings rootSettings, bool skipProjectReferences =
4747
return;
4848
}
4949

50-
var projectDependencies = ResolveTransitiveClosureProjectDependencies(rootSettings.ProjectDirectory);
50+
var projectDependencies = ResolveTransitiveClosureProjectDependencies(rootSettings.ProjectDirectory, rootSettings.ProjectXProjFilePath);
5151

5252
foreach(var project in projectDependencies)
5353
{
@@ -60,11 +60,10 @@ public void Migrate(MigrationSettings rootSettings, bool skipProjectReferences =
6060
}
6161
}
6262

63-
private IEnumerable<ProjectDependency> ResolveTransitiveClosureProjectDependencies(string rootProject)
63+
private IEnumerable<ProjectDependency> ResolveTransitiveClosureProjectDependencies(string rootProject, string xprojFile)
6464
{
6565
HashSet<ProjectDependency> projectsMap = new HashSet<ProjectDependency>(new ProjectDependencyComparer());
66-
var projectContexts = ProjectContext.CreateContextForEachFramework(rootProject);
67-
var projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectContexts);
66+
var projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(rootProject, xprojFile);
6867
Queue<ProjectDependency> projectsQueue = new Queue<ProjectDependency>(projectDependencies);
6968

7069
while(projectsQueue.Count() != 0)
@@ -78,8 +77,8 @@ private IEnumerable<ProjectDependency> ResolveTransitiveClosureProjectDependenci
7877

7978
projectsMap.Add(projectDependency);
8079

81-
projectContexts = ProjectContext.CreateContextForEachFramework(projectDependency.ProjectFilePath);
82-
projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectContexts);
80+
var projectDir = Path.GetDirectoryName(projectDependency.ProjectFilePath);
81+
projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectDir);
8382

8483
foreach(var project in projectDependencies)
8584
{
@@ -110,7 +109,7 @@ private void MigrateHelper(MigrationSettings migrationSettings)
110109
private MigrationRuleInputs ComputeMigrationRuleInputs(MigrationSettings migrationSettings)
111110
{
112111
var projectContexts = ProjectContext.CreateContextForEachFramework(migrationSettings.ProjectDirectory);
113-
var xprojFile = migrationSettings.ProjectXProjFilePath ?? FindXprojFile(migrationSettings.ProjectDirectory);
112+
var xprojFile = migrationSettings.ProjectXProjFilePath ?? _projectDependencyFinder.FindXprojFile(migrationSettings.ProjectDirectory);
114113

115114
ProjectRootElement xproj = null;
116115
if (xprojFile != null)
@@ -130,20 +129,6 @@ private MigrationRuleInputs ComputeMigrationRuleInputs(MigrationSettings migrati
130129
return new MigrationRuleInputs(projectContexts, templateMSBuildProject, itemGroup, propertyGroup, xproj);
131130
}
132131

133-
private string FindXprojFile(string projectDirectory)
134-
{
135-
var allXprojFiles = Directory.EnumerateFiles(projectDirectory, "*.xproj", SearchOption.TopDirectoryOnly);
136-
137-
if (allXprojFiles.Count() > 1)
138-
{
139-
MigrationErrorCodes
140-
.MIGRATE1017($"Multiple xproj files found in {projectDirectory}, please specify which to use")
141-
.Throw();
142-
}
143-
144-
return allXprojFiles.FirstOrDefault();
145-
}
146-
147132
private void VerifyInputs(MigrationRuleInputs migrationRuleInputs, MigrationSettings migrationSettings)
148133
{
149134
VerifyProject(migrationRuleInputs.ProjectContexts, migrationSettings.ProjectDirectory);

src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigrateProjectDependenciesRule.cs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void Apply(MigrationSettings migrationSettings, MigrationRuleInputs migra
3030
{
3131
_projectDirectory = migrationSettings.ProjectDirectory;
3232

33-
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationSettings, migrationRuleInputs);
33+
var migratedXProjDependencyPaths = MigrateXProjProjectDependencies(migrationRuleInputs);
3434
var migratedXProjDependencyNames = new HashSet<string>(migratedXProjDependencyPaths.Select(p => Path.GetFileNameWithoutExtension(p)));
3535

3636
AddPropertyTransformsToCommonPropertyGroup(migrationRuleInputs.CommonPropertyGroup);
@@ -40,23 +40,17 @@ public void Apply(MigrationSettings migrationSettings, MigrationRuleInputs migra
4040
migrationRuleInputs.OutputMSBuildProject);
4141
}
4242

43-
private IEnumerable<string> MigrateXProjProjectDependencies(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs)
43+
private IEnumerable<string> MigrateXProjProjectDependencies(MigrationRuleInputs migrationRuleInputs)
4444
{
45-
var xproj = migrationRuleInputs.ProjectXproj;
46-
if (xproj == null)
45+
var csprojReferenceItems = _projectDependencyFinder.ResolveXProjProjectDependencies(migrationRuleInputs.ProjectXproj);
46+
47+
if (!csprojReferenceItems.Any())
4748
{
48-
MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: No xproj file given.");
4949
return Enumerable.Empty<string>();
5050
}
5151

5252
var csprojTransformedReferences = new List<ProjectItemElement>();
5353

54-
var csprojReferenceItems = xproj.Items
55-
.Where(i => i.ItemType == "ProjectReference")
56-
.Where(p =>
57-
p.Includes().Any(
58-
include => string.Equals(Path.GetExtension(include), ".csproj", StringComparison.OrdinalIgnoreCase)));
59-
6054
foreach (var csprojReferenceItem in csprojReferenceItems)
6155
{
6256
var conditionChain = csprojReferenceItem.ConditionChain();
@@ -71,8 +65,7 @@ private IEnumerable<string> MigrateXProjProjectDependencies(MigrationSettings mi
7165

7266
csprojTransformedReferences.Add(transformItem);
7367
}
74-
75-
68+
7669
MigrationTrace.Instance.WriteLine($"{nameof(MigrateProjectDependenciesRule)}: Migrating {csprojTransformedReferences.Count()} xproj to csproj references");
7770

7871
foreach (var csprojTransformedReference in csprojTransformedReferences)
@@ -91,7 +84,6 @@ public void MigrateProjectJsonProjectDependencies(
9184
foreach (var projectContext in projectContexts)
9285
{
9386
var projectDependencies = _projectDependencyFinder.ResolveProjectDependencies(projectContext, migratedXProjDependencyNames);
94-
var projectExports = projectContext.CreateExporter("_").GetDependencies();
9587

9688
var projectDependencyTransformResults = projectDependencies.Select(p => ProjectDependencyTransform.Transform(p));
9789

0 commit comments

Comments
 (0)