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

Commit 46ca51e

Browse files
mrwardmonojenkins
authored andcommitted
[NuGet] Fix projects not being re-evaluated after packages updated
Updating a package for multiple projects in one step results in the NuGet package restore that is done at the end being a no-op. This means that the project is not re-evaluated which can mean that the AvailableItemNames are not updated. Updating a single NuGet package does not have the same problem. Also fixed a problem where a PackageReference project (non-sdk) was not re-evaluated on restoring. This could also result in the AvailableItemNames not being available to the project if the project was missing its obj/project.assets.json file on being opened in the IDE.
1 parent b01f3bc commit 46ca51e

File tree

6 files changed

+191
-1
lines changed

6 files changed

+191
-1
lines changed

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

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
using System.Threading.Tasks;
2929
using MonoDevelop.PackageManagement.Tests.Helpers;
3030
using MonoDevelop.Projects;
31+
using NuGet.Packaging.Core;
3132
using NuGet.Versioning;
3233
using NUnit.Framework;
3334
using UnitTests;
@@ -54,6 +55,72 @@ public async Task InstallPackage_PackageDefinesCustomAvailableItemNames_BuildAct
5455
}
5556
}
5657

58+
[Test]
59+
public async Task UpdatePackage_PackageDefinesCustomAvailableItemNames_BuildActionsIncludeUpdateAvailableItemNames ()
60+
{
61+
string solutionFileName = Util.GetSampleProject ("NuGetUpdateAvailableItems", "NuGetUpdateAvailableItems.sln");
62+
using (solution = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName)) {
63+
CreateNuGetConfigFile (solution.BaseDirectory);
64+
await RestoreNuGetPackages (solution);
65+
var packageReferenceProject = (DotNetProject)solution.FindProjectByName ("PackageReferenceProject");
66+
var sdkStyleProject = (DotNetProject)solution.FindProjectByName ("SdkStyleProject");
67+
68+
var originalBuildActions = packageReferenceProject.GetBuildActions ();
69+
70+
Assert.That (originalBuildActions, Contains.Item ("TestXamAvailableItem"));
71+
Assert.IsFalse (originalBuildActions.Contains ("TestXamAvailableItemUpdated"));
72+
73+
originalBuildActions = sdkStyleProject.GetBuildActions ();
74+
75+
Assert.That (originalBuildActions, Contains.Item ("TestXamAvailableItem"));
76+
Assert.IsFalse (originalBuildActions.Contains ("TestXamAvailableItemUpdated"));
77+
78+
await UpdateNuGetPackage (packageReferenceProject, "Test.Xam.AvailableItemName");
79+
await UpdateNuGetPackage (sdkStyleProject, "Test.Xam.AvailableItemName");
80+
81+
var updatedBuildActions = packageReferenceProject.GetBuildActions ();
82+
83+
Assert.That (updatedBuildActions, Contains.Item ("TestXamAvailableItemUpdated"));
84+
85+
updatedBuildActions = sdkStyleProject.GetBuildActions ();
86+
87+
Assert.That (updatedBuildActions, Contains.Item ("TestXamAvailableItemUpdated"));
88+
}
89+
}
90+
91+
[Test]
92+
public async Task UpdateMultiplePackages_PackageDefinesCustomAvailableItemNames_BuildActionsIncludeUpdateAvailableItemNames ()
93+
{
94+
string solutionFileName = Util.GetSampleProject ("NuGetUpdateAvailableItems", "NuGetUpdateAvailableItems.sln");
95+
using (solution = (Solution)await Services.ProjectService.ReadWorkspaceItem (Util.GetMonitor (), solutionFileName)) {
96+
CreateNuGetConfigFile (solution.BaseDirectory);
97+
await RestoreNuGetPackages (solution);
98+
var packageReferenceProject = (DotNetProject)solution.FindProjectByName ("PackageReferenceProject");
99+
var sdkStyleProject = (DotNetProject)solution.FindProjectByName ("SdkStyleProject");
100+
101+
var originalBuildActions = packageReferenceProject.GetBuildActions ();
102+
103+
Assert.That (originalBuildActions, Contains.Item ("TestXamAvailableItem"));
104+
Assert.IsFalse (originalBuildActions.Contains ("TestXamAvailableItemUpdated"));
105+
106+
originalBuildActions = sdkStyleProject.GetBuildActions ();
107+
108+
Assert.That (originalBuildActions, Contains.Item ("TestXamAvailableItem"));
109+
Assert.IsFalse (originalBuildActions.Contains ("TestXamAvailableItemUpdated"));
110+
111+
var projects = new [] { packageReferenceProject, sdkStyleProject };
112+
await UpdateNuGetPackage (projects, "Test.Xam.AvailableItemName", "0.2.0");
113+
114+
var updatedBuildActions = packageReferenceProject.GetBuildActions ();
115+
116+
Assert.That (updatedBuildActions, Contains.Item ("TestXamAvailableItemUpdated"));
117+
118+
updatedBuildActions = sdkStyleProject.GetBuildActions ();
119+
120+
Assert.That (updatedBuildActions, Contains.Item ("TestXamAvailableItemUpdated"));
121+
}
122+
}
123+
57124
Task InstallNuGetPackage (DotNetProject project, string packageId, string packageVersion)
58125
{
59126
var solutionManager = new MonoDevelopSolutionManager (project.ParentSolution);
@@ -70,5 +137,46 @@ Task InstallNuGetPackage (DotNetProject project, string packageId, string packag
70137
action.Execute ();
71138
});
72139
}
140+
141+
Task UpdateNuGetPackage (DotNetProject project, string packageId)
142+
{
143+
var solutionManager = new MonoDevelopSolutionManager (project.ParentSolution);
144+
var context = CreateNuGetProjectContext (solutionManager.Settings);
145+
var packageManager = new MonoDevelopNuGetPackageManager (solutionManager);
146+
147+
var action = new UpdateNuGetPackageAction (
148+
solutionManager,
149+
new DotNetProjectProxy (project),
150+
context,
151+
packageManager,
152+
PackageManagementServices.PackageManagementEvents) {
153+
PackageId = packageId
154+
};
155+
156+
return Task.Run (() => {
157+
action.Execute ();
158+
});
159+
}
160+
161+
Task UpdateNuGetPackage (DotNetProject[] projects, string packageId, string packageVersion)
162+
{
163+
var solutionManager = new MonoDevelopSolutionManager (projects [0].ParentSolution);
164+
var context = CreateNuGetProjectContext (solutionManager.Settings);
165+
var sources = solutionManager.CreateSourceRepositoryProvider ().GetRepositories ();
166+
167+
var action = new UpdateMultipleNuGetPackagesAction (sources, solutionManager, context);
168+
action.LicensesMustBeAccepted = false;
169+
170+
foreach (DotNetProject project in projects) {
171+
action.AddProject (new DotNetProjectProxy (project));
172+
}
173+
174+
var packageIdentity = new PackageIdentity (packageId, NuGetVersion.Parse (packageVersion));
175+
action.AddPackageToUpdate (packageIdentity);
176+
177+
return Task.Run (() => {
178+
action.Execute ();
179+
});
180+
}
73181
}
74182
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,10 @@ DotNetProject GetProjectToReloadAfterRestore (BuildIntegratedNuGetProject projec
250250
if (dotNetCoreNuGetProject?.ProjectRequiresReloadAfterRestore () == true)
251251
return dotNetCoreNuGetProject.DotNetProject;
252252

253+
var packageReferenceNuGetProject = project as PackageReferenceNuGetProject;
254+
if (packageReferenceNuGetProject?.ProjectRequiresReloadAfterRestore () == true)
255+
return packageReferenceNuGetProject.DotNetProject;
256+
253257
return null;
254258
}
255259

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,12 @@ async Task RestorePackagesAsync (
351351
dotNetProject.DotNetProject.ShutdownProjectBuilder ();
352352

353353
if (!packageRestorer.LockFileChanged) {
354+
// Need to re-evaluate. When updating multiple projects the restore done at the end
355+
// may be a no-op. This results in no re-evaluation being done so we re-evaluate here.
356+
//
354357
// Need to refresh the references since the restore did not.
355-
await Runtime.RunInMainThread (() => {
358+
await Runtime.RunInMainThread (async () => {
359+
await dotNetProject.DotNetProject.ReevaluateProject (new ProgressMonitor ());
356360
dotNetProject.DotNetProject.DotNetCoreNotifyReferencesChanged ();
357361
});
358362
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 11.00
3+
# Visual Studio 2010
4+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageReferenceProject", "PackageReferenceProject\PackageReferenceProject.csproj", "{7F63CBE6-2FE7-47A7-8930-EA078DA05062}"
5+
EndProject
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SdkStyleProject", "SdkStyleProject\SdkStyleProject.csproj", "{5B443F8D-6C84-443F-A395-5429E8F4A47D}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|Any CPU = Debug|Any CPU
11+
Release|Any CPU = Release|Any CPU
12+
EndGlobalSection
13+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+
{7F63CBE6-2FE7-47A7-8930-EA078DA05062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15+
{7F63CBE6-2FE7-47A7-8930-EA078DA05062}.Debug|Any CPU.Build.0 = Debug|Any CPU
16+
{7F63CBE6-2FE7-47A7-8930-EA078DA05062}.Release|Any CPU.ActiveCfg = Release|Any CPU
17+
{7F63CBE6-2FE7-47A7-8930-EA078DA05062}.Release|Any CPU.Build.0 = Release|Any CPU
18+
{5B443F8D-6C84-443F-A395-5429E8F4A47D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
19+
{5B443F8D-6C84-443F-A395-5429E8F4A47D}.Debug|Any CPU.Build.0 = Debug|Any CPU
20+
{5B443F8D-6C84-443F-A395-5429E8F4A47D}.Release|Any CPU.ActiveCfg = Release|Any CPU
21+
{5B443F8D-6C84-443F-A395-5429E8F4A47D}.Release|Any CPU.Build.0 = Release|Any CPU
22+
EndGlobalSection
23+
GlobalSection(MonoDevelopProperties) = preSolution
24+
EndGlobalSection
25+
EndGlobal
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+
<ProductVersion>10.0.0</ProductVersion>
7+
<SchemaVersion>2.0</SchemaVersion>
8+
<ProjectGuid>{7F63CBE6-2FE7-47A7-8930-EA078DA05062}</ProjectGuid>
9+
<OutputType>Library</OutputType>
10+
<AssemblyName>RestoreStylePackageReference</AssemblyName>
11+
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
12+
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
13+
</PropertyGroup>
14+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
15+
<DebugSymbols>true</DebugSymbols>
16+
<Optimize>true</Optimize>
17+
<OutputPath>bin\Debug</OutputPath>
18+
<DefineConstants>DEBUG</DefineConstants>
19+
<ErrorReport>prompt</ErrorReport>
20+
<WarningLevel>4</WarningLevel>
21+
<ConsolePause>false</ConsolePause>
22+
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
23+
</PropertyGroup>
24+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
25+
<Optimize>true</Optimize>
26+
<OutputPath>bin\Release</OutputPath>
27+
<ErrorReport>prompt</ErrorReport>
28+
<WarningLevel>4</WarningLevel>
29+
<ConsolePause>false</ConsolePause>
30+
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
31+
</PropertyGroup>
32+
<ItemGroup>
33+
<Reference Include="System" />
34+
</ItemGroup>
35+
<ItemGroup>
36+
<PackageReference Include="Test.Xam.AvailableItemName" Version="0.1.0" />
37+
</ItemGroup>
38+
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
39+
</Project>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard1.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<PackageReference Include="Test.Xam.AvailableItemName" Version="0.1.0" />
9+
</ItemGroup>
10+
</Project>

0 commit comments

Comments
 (0)