Skip to content

Commit 85ac0de

Browse files
authored
Use same build session for restore and build (#54)
Fixes #53
1 parent 3606226 commit 85ac0de

File tree

2 files changed

+119
-81
lines changed

2 files changed

+119
-81
lines changed

src/MSBuildProjectCreator.UnitTests/BuildTests.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,52 @@ public void ProjectCollectionLoggersWork()
122122
fileLogContents.ShouldContain("2AE492F6EEE04255B31B088051E9AF0F", fileLogContents);
123123
}
124124

125+
[Fact]
126+
public void ProjectCollectionLoggersWorkWithRestore()
127+
{
128+
string binLogPath = Path.Combine(TestRootPath, "test.binlog");
129+
string fileLogPath = Path.Combine(TestRootPath, "test.log");
130+
131+
using (ProjectCollection projectCollection = new ProjectCollection())
132+
{
133+
projectCollection.RegisterLogger(new BinaryLogger
134+
{
135+
Parameters = $"LogFile={binLogPath}",
136+
});
137+
138+
projectCollection.RegisterLogger(new FileLogger
139+
{
140+
Parameters = $"LogFile={fileLogPath}",
141+
Verbosity = LoggerVerbosity.Normal,
142+
ShowSummary = true,
143+
});
144+
145+
ProjectCreator.Templates
146+
.LogsMessage(
147+
text: "$(Property1)",
148+
projectCollection: projectCollection)
149+
.Property("Property1", "B7F9A257198D4A44A06BB6146AB27440")
150+
.Target("Restore")
151+
.TaskMessage("38EC33B686134B3C8DE4B8E571D4FB24", MessageImportance.High)
152+
.Save(GetTempFileName(".proj"))
153+
.TryBuild(restore: true, out bool result, out BuildOutput buildOutput);
154+
155+
result.ShouldBeTrue();
156+
157+
buildOutput.MessageEvents.High.ShouldContain(i => i.Message == "38EC33B686134B3C8DE4B8E571D4FB24", buildOutput.GetConsoleLog());
158+
buildOutput.MessageEvents.Normal.ShouldContain(i => i.Message == "B7F9A257198D4A44A06BB6146AB27440", buildOutput.GetConsoleLog());
159+
}
160+
161+
File.Exists(binLogPath).ShouldBeTrue();
162+
163+
File.Exists(fileLogPath).ShouldBeTrue();
164+
165+
string fileLogContents = File.ReadAllText(fileLogPath);
166+
167+
fileLogContents.ShouldContain("38EC33B686134B3C8DE4B8E571D4FB24", fileLogContents);
168+
fileLogContents.ShouldContain("B7F9A257198D4A44A06BB6146AB27440", fileLogContents);
169+
}
170+
125171
[Fact]
126172
public void RestoreTargetCanBeRun()
127173
{

src/MSBuildProjectCreator/ProjectCreator.Build.cs

Lines changed: 73 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,9 @@ public ProjectCreator TryBuild(string target, out bool result, out BuildOutput b
6868
/// <returns>The current <see cref="ProjectCreator"/>.</returns>
6969
public ProjectCreator TryBuild(bool restore, string target, out bool result, out BuildOutput buildOutput)
7070
{
71-
if (restore)
72-
{
73-
TryRestore(out result, out buildOutput);
74-
75-
if (!result)
76-
{
77-
return this;
78-
}
79-
}
80-
else
81-
{
82-
buildOutput = BuildOutput.Create();
83-
}
71+
buildOutput = BuildOutput.Create();
8472

85-
Build(target.ToArrayWithSingleElement(), buildOutput, out result, out _);
73+
Build(restore, target.ToArrayWithSingleElement(), buildOutput, out result, out _);
8674

8775
return this;
8876
}
@@ -140,21 +128,9 @@ public ProjectCreator TryBuild(out bool result, out BuildOutput buildOutput)
140128
/// <returns>The current <see cref="ProjectCreator"/>.</returns>
141129
public ProjectCreator TryBuild(bool restore, out bool result, out BuildOutput buildOutput)
142130
{
143-
if (restore)
144-
{
145-
TryRestore(out result, out buildOutput);
146-
147-
if (!result)
148-
{
149-
return this;
150-
}
151-
}
152-
else
153-
{
154-
buildOutput = BuildOutput.Create();
155-
}
131+
buildOutput = BuildOutput.Create();
156132

157-
Build(null, buildOutput, out result, out _);
133+
Build(restore, null, buildOutput, out result, out _);
158134

159135
return this;
160136
}
@@ -210,21 +186,9 @@ public ProjectCreator TryBuild(string[] targets, out bool result, out BuildOutpu
210186
/// <returns>The current <see cref="ProjectCreator"/>.</returns>
211187
public ProjectCreator TryBuild(bool restore, string[] targets, out bool result, out BuildOutput buildOutput, out IDictionary<string, TargetResult> targetOutputs)
212188
{
213-
if (restore)
214-
{
215-
TryRestore(out result, out buildOutput, out targetOutputs);
216-
217-
if (!result)
218-
{
219-
return this;
220-
}
221-
}
222-
else
223-
{
224-
buildOutput = BuildOutput.Create();
225-
}
189+
buildOutput = BuildOutput.Create();
226190

227-
Build(targets, buildOutput, out result, out targetOutputs);
191+
Build(restore, targets, buildOutput, out result, out targetOutputs);
228192

229193
return this;
230194
}
@@ -286,73 +250,43 @@ public ProjectCreator TryRestore(out bool result, out BuildOutput buildOutput)
286250
/// <returns>The current <see cref="ProjectCreator"/>.</returns>
287251
public ProjectCreator TryRestore(out bool result, out BuildOutput buildOutput, out IDictionary<string, TargetResult> targetOutputs)
288252
{
289-
Save();
290-
291253
buildOutput = BuildOutput.Create();
292254

293255
lock (BuildManager.DefaultBuildManager)
294256
{
295-
BuildRequestData restoreRequest = new BuildRequestData(
296-
FullPath,
297-
new Dictionary<string, string>
298-
{
299-
["ExcludeRestorePackageImports"] = "true",
300-
["MSBuildRestoreSessionId"] = Guid.NewGuid().ToString("D"),
301-
},
302-
ProjectCollection.DefaultToolsVersion,
303-
targetsToBuild: new[] { "Restore" },
304-
hostServices: null,
305-
flags: BuildRequestDataFlags.ClearCachesAfterBuild | BuildRequestDataFlags.SkipNonexistentTargets | BuildRequestDataFlags.IgnoreMissingEmptyAndInvalidImports);
306-
307257
BuildParameters buildParameters = new BuildParameters
308258
{
309-
Loggers = new List<Framework.ILogger>
310-
{
311-
buildOutput,
312-
},
259+
Loggers = new List<Framework.ILogger>(ProjectCollection.Loggers.Concat(buildOutput.AsEnumerable())),
313260
};
314261

315262
BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
263+
316264
try
317265
{
318-
BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(restoreRequest);
319-
320-
BuildResult buildResult = buildSubmission.Execute();
321-
322-
result = buildResult.OverallResult == BuildResultCode.Success;
323-
324-
targetOutputs = buildResult.ResultsByTarget;
266+
Restore(out result, out targetOutputs);
325267
}
326268
finally
327269
{
328270
BuildManager.DefaultBuildManager.EndBuild();
329271
}
330272
}
331273

332-
Project.MarkDirty();
333-
334-
Project.ReevaluateIfNecessary();
335-
336274
return this;
337275
}
338276

339277
private void Build(string[] targets, out bool result, out BuildOutput buildOutput, out IDictionary<string, TargetResult> targetOutputs)
340278
{
341279
buildOutput = BuildOutput.Create();
342280

343-
Build(targets, buildOutput, out result, out targetOutputs);
281+
Build(restore: false, targets, buildOutput, out result, out targetOutputs);
344282
}
345283

346-
private void Build(string[] targets, BuildOutput buildOutput, out bool result, out IDictionary<string, TargetResult> targetOutputs)
284+
private void Build(bool restore, string[] targets, BuildOutput buildOutput, out bool result, out IDictionary<string, TargetResult> targetOutputs)
347285
{
286+
targetOutputs = null;
287+
348288
lock (BuildManager.DefaultBuildManager)
349289
{
350-
BuildRequestData restoreRequest = new BuildRequestData(
351-
ProjectInstance,
352-
targetsToBuild: targets ?? ProjectInstance.DefaultTargets.ToArray(),
353-
hostServices: null,
354-
flags: BuildRequestDataFlags.ReplaceExistingProjectInstance);
355-
356290
BuildParameters buildParameters = new BuildParameters
357291
{
358292
Loggers = new List<Framework.ILogger>(ProjectCollection.Loggers.Concat(buildOutput.AsEnumerable())),
@@ -361,19 +295,77 @@ private void Build(string[] targets, BuildOutput buildOutput, out bool result, o
361295
BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
362296
try
363297
{
364-
BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(restoreRequest);
298+
if (restore)
299+
{
300+
Restore(out result, out targetOutputs);
301+
302+
if (!result)
303+
{
304+
return;
305+
}
306+
}
307+
308+
BuildRequestData buildRequestData = new BuildRequestData(
309+
ProjectInstance,
310+
targetsToBuild: targets ?? ProjectInstance.DefaultTargets.ToArray(),
311+
hostServices: null,
312+
flags: BuildRequestDataFlags.ReplaceExistingProjectInstance);
313+
314+
BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequestData);
365315

366316
BuildResult buildResult = buildSubmission.Execute();
367317

368318
result = buildResult.OverallResult == BuildResultCode.Success;
369319

370-
targetOutputs = buildResult.ResultsByTarget;
320+
if (targetOutputs != null)
321+
{
322+
foreach (KeyValuePair<string, TargetResult> targetResult in buildResult.ResultsByTarget)
323+
{
324+
targetOutputs[targetResult.Key] = targetResult.Value;
325+
}
326+
}
327+
else
328+
{
329+
targetOutputs = buildResult.ResultsByTarget;
330+
}
371331
}
372332
finally
373333
{
374334
BuildManager.DefaultBuildManager.EndBuild();
375335
}
376336
}
377337
}
338+
339+
private void Restore(out bool result, out IDictionary<string, TargetResult> targetOutputs)
340+
{
341+
Save();
342+
343+
IDictionary<string, string> globalProperties = new Dictionary<string, string>(ProjectCollection.GlobalProperties);
344+
345+
globalProperties["ExcludeRestorePackageImports"] = "true";
346+
globalProperties["MSBuildRestoreSessionId"] = Guid.NewGuid().ToString("D");
347+
348+
BuildRequestData buildRequestData = new BuildRequestData(
349+
FullPath,
350+
globalProperties,
351+
ProjectCollection.DefaultToolsVersion,
352+
targetsToBuild: new[] { "Restore" },
353+
hostServices: null,
354+
flags: BuildRequestDataFlags.ClearCachesAfterBuild | BuildRequestDataFlags.SkipNonexistentTargets | BuildRequestDataFlags.IgnoreMissingEmptyAndInvalidImports);
355+
356+
BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequestData);
357+
358+
BuildResult buildResult = buildSubmission.Execute();
359+
360+
Project.MarkDirty();
361+
362+
Project.ReevaluateIfNecessary();
363+
364+
_projectInstance = Project.CreateProjectInstance();
365+
366+
targetOutputs = buildResult.ResultsByTarget;
367+
368+
result = buildResult.OverallResult == BuildResultCode.Success;
369+
}
378370
}
379371
}

0 commit comments

Comments
 (0)