Skip to content
This repository was archived by the owner on Oct 4, 2021. It is now read-only.

Commit b7c31fb

Browse files
authored
Merge pull request #1963 from mono/dotnetcore-handle-missing-project-on-restore
[NuGet] Handle missing project when restoring a .NET Core project
2 parents 6b9f674 + 97154c1 commit b7c31fb

File tree

3 files changed

+54
-13
lines changed

3 files changed

+54
-13
lines changed

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/PackageSpecCreatorTests.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
using MonoDevelop.Projects;
3030
using NuGet.Frameworks;
3131
using NuGet.LibraryModel;
32+
using NuGet.ProjectManagement;
3233
using NuGet.ProjectModel;
3334
using NUnit.Framework;
3435

@@ -40,9 +41,13 @@ public class PackageSpecCreatorTests
4041
PackageSpec spec;
4142
FakeDotNetProject project;
4243
FakeSolution solution;
44+
PackageManagementEvents packageManagementEvents;
45+
PackageManagementLogger logger;
4346

4447
void CreateProject (string name, string fileName = @"d:\projects\MyProject\MyProject.csproj")
4548
{
49+
packageManagementEvents = new PackageManagementEvents ();
50+
logger = new PackageManagementLogger (packageManagementEvents);
4651
solution = new FakeSolution ();
4752
project = new FakeDotNetProject (fileName.ToNativePath ());
4853
project.ParentSolution = solution;
@@ -56,7 +61,7 @@ void AddTargetFramework (string targetFramework)
5661

5762
void CreatePackageSpec ()
5863
{
59-
spec = PackageSpecCreator.CreatePackageSpec (project);
64+
spec = PackageSpecCreator.CreatePackageSpec (project, logger);
6065
}
6166

6267
void AddPackageReference (string id, string version)
@@ -177,6 +182,34 @@ public void CreatePackageSpec_OneSharedProjectReference_NoProjectReferencedAdded
177182
Assert.AreEqual (0, targetFramework.ProjectReferences.Count);
178183
}
179184

185+
[Test]
186+
public void CreatePackageSpec_OneProjectReferenceWhichCannotBeResolved_WarningLoggedAndNoProjectReferencedAddedToPackageSpec ()
187+
{
188+
CreateProject ("MyProject", @"d:\projects\MyProject\MyProject.csproj");
189+
AddTargetFramework ("netcoreapp1.0");
190+
string referencedProjectFileName = @"d:\projects\MyProject\Lib\Lib.csproj".ToNativePath ();
191+
string include = @"Lib\Lib.csproj".ToNativePath ();
192+
AddProjectReference ("Lib", referencedProjectFileName, include);
193+
solution.OnResolveProject = pr => {
194+
return null;
195+
};
196+
PackageOperationMessage messageLogged = null;
197+
packageManagementEvents.PackageOperationMessageLogged += (sender, e) => {
198+
messageLogged = e.Message;
199+
};
200+
CreatePackageSpec ();
201+
202+
var targetFramework = spec.RestoreMetadata.TargetFrameworks.Single ();
203+
string expectedMessage = string.Format ("WARNING: Unable to resolve project '{0}' referenced by 'MyProject'.", include);
204+
Assert.AreEqual ("MyProject", spec.Name);
205+
Assert.AreEqual ("MyProject", spec.RestoreMetadata.ProjectName);
206+
Assert.AreEqual ("netcoreapp1.0", spec.RestoreMetadata.OriginalTargetFrameworks.Single ());
207+
Assert.AreEqual (".NETCoreApp,Version=v1.0", targetFramework.FrameworkName.ToString ());
208+
Assert.AreEqual (expectedMessage, messageLogged.ToString ());
209+
Assert.AreEqual (MessageLevel.Warning, messageLogged.Level);
210+
Assert.AreEqual (0, targetFramework.ProjectReferences.Count);
211+
}
212+
180213
[Test]
181214
public void CreatePackageSpec_PackageTargetFallback_ImportsAddedToTargetFramework ()
182215
{

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/DotNetCoreNuGetProject.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ public override async Task<IReadOnlyList<PackageSpec>> GetPackageSpecsAsync (Dep
203203
return new [] { existingPackageSpec };
204204
}
205205

206-
PackageSpec packageSpec = await CreateProjectPackageSpec ();
206+
PackageSpec packageSpec = await CreateProjectPackageSpec (context);
207207

208208
if (context != null) {
209209
AddToCache (context, packageSpec);
@@ -223,15 +223,15 @@ PackageSpec GetExistingProjectPackageSpec (DependencyGraphCacheContext context)
223223
return packageSpec;
224224
}
225225

226-
async Task<PackageSpec> CreateProjectPackageSpec ()
226+
async Task<PackageSpec> CreateProjectPackageSpec (DependencyGraphCacheContext context)
227227
{
228-
PackageSpec packageSpec = await Runtime.RunInMainThread (() => CreateProjectPackageSpec (project));
228+
PackageSpec packageSpec = await Runtime.RunInMainThread (() => CreateProjectPackageSpec (project, context));
229229
return packageSpec;
230230
}
231231

232-
static PackageSpec CreateProjectPackageSpec (DotNetProject project)
232+
static PackageSpec CreateProjectPackageSpec (DotNetProject project, DependencyGraphCacheContext context)
233233
{
234-
PackageSpec packageSpec = PackageSpecCreator.CreatePackageSpec (project);
234+
PackageSpec packageSpec = PackageSpecCreator.CreatePackageSpec (project, context.Logger);
235235
return packageSpec;
236236
}
237237

main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/PackageSpecCreator.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@
2424
using System;
2525
using System.Collections.Generic;
2626
using System.Linq;
27+
using MonoDevelop.Core;
2728
using MonoDevelop.Projects;
2829
using NuGet.Commands;
30+
using NuGet.Common;
2931
using NuGet.Frameworks;
3032
using NuGet.LibraryModel;
3133
using NuGet.ProjectModel;
@@ -36,12 +38,12 @@ namespace MonoDevelop.PackageManagement
3638
{
3739
static class PackageSpecCreator
3840
{
39-
public static PackageSpec CreatePackageSpec (DotNetProject project)
41+
public static PackageSpec CreatePackageSpec (DotNetProject project, ILogger logger)
4042
{
41-
return CreatePackageSpec (new DotNetProjectProxy (project));
43+
return CreatePackageSpec (new DotNetProjectProxy (project), logger);
4244
}
4345

44-
public static PackageSpec CreatePackageSpec (IDotNetProject project)
46+
public static PackageSpec CreatePackageSpec (IDotNetProject project, ILogger logger)
4547
{
4648
var packageSpec = new PackageSpec (GetTargetFrameworks (project));
4749
packageSpec.FilePath = project.FileName;
@@ -50,7 +52,7 @@ public static PackageSpec CreatePackageSpec (IDotNetProject project)
5052

5153
packageSpec.RestoreMetadata = CreateRestoreMetadata (packageSpec, project);
5254
packageSpec.RuntimeGraph = GetRuntimeGraph (project);
53-
AddProjectReferences (packageSpec, project);
55+
AddProjectReferences (packageSpec, project, logger);
5456
AddPackageReferences (packageSpec, project);
5557
AddPackageTargetFallbacks (packageSpec, project);
5658

@@ -116,7 +118,7 @@ static IEnumerable<string> GetOriginalTargetFrameworks (IDotNetProject project)
116118
return new string[0];
117119
}
118120

119-
static void AddProjectReferences (PackageSpec spec, IDotNetProject project)
121+
static void AddProjectReferences (PackageSpec spec, IDotNetProject project, ILogger logger)
120122
{
121123
// Add groups for each spec framework
122124
var frameworkGroups = new Dictionary<NuGetFramework, List<ProjectRestoreReference>> ();
@@ -125,7 +127,8 @@ static void AddProjectReferences (PackageSpec spec, IDotNetProject project)
125127
}
126128

127129
var flatReferences = project.References.Where (IsProjectReference)
128-
.Select (projectReference => GetProjectRestoreReference (projectReference, project));
130+
.Select (projectReference => GetProjectRestoreReference (projectReference, project, logger))
131+
.Where (projectReference => projectReference != null);
129132

130133
// Add project paths
131134
foreach (var frameworkPair in flatReferences) {
@@ -168,11 +171,16 @@ static bool IsProjectReference (ProjectReference projectReference)
168171

169172
static Tuple<List<NuGetFramework>, ProjectRestoreReference> GetProjectRestoreReference (
170173
ProjectReference item,
171-
IDotNetProject project)
174+
IDotNetProject project,
175+
ILogger logger)
172176
{
173177
var frameworks = GetFrameworks (project).ToList ();
174178

175179
var referencedProject = project.ParentSolution.ResolveProject (item);
180+
if (referencedProject == null) {
181+
logger.LogWarning (GettextCatalog.GetString ("WARNING: Unable to resolve project '{0}' referenced by '{1}'.", item.Include, project.Name));
182+
return null;
183+
}
176184

177185
var reference = new ProjectRestoreReference () {
178186
ProjectPath = referencedProject.FileName,

0 commit comments

Comments
 (0)