Fix multi node build
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using Ardalis.GuardClauses;
|
||||||
using Microsoft.Build.Execution;
|
using Microsoft.Build.Execution;
|
||||||
using Microsoft.Build.Framework;
|
using Microsoft.Build.Framework;
|
||||||
using Microsoft.Build.Logging;
|
using Microsoft.Build.Logging;
|
||||||
@@ -22,8 +23,13 @@ public class BuildService
|
|||||||
var normalOut = Console.Out;
|
var normalOut = Console.Out;
|
||||||
Console.SetOut(BuildTextWriter);
|
Console.SetOut(BuildTextWriter);
|
||||||
var terminalLogger = InternalTerminalLoggerFactory.CreateLogger();
|
var terminalLogger = InternalTerminalLoggerFactory.CreateLogger();
|
||||||
|
Console.SetOut(normalOut);
|
||||||
|
|
||||||
|
var nodesToBuildWith = GetBuildNodeCount(Environment.ProcessorCount);
|
||||||
var buildParameters = new BuildParameters
|
var buildParameters = new BuildParameters
|
||||||
{
|
{
|
||||||
|
MaxNodeCount = nodesToBuildWith,
|
||||||
|
DisableInProcNode = true,
|
||||||
Loggers =
|
Loggers =
|
||||||
[
|
[
|
||||||
//new BinaryLogger { Parameters = "msbuild.binlog" },
|
//new BinaryLogger { Parameters = "msbuild.binlog" },
|
||||||
@@ -32,16 +38,8 @@ public class BuildService
|
|||||||
//new InMemoryLogger(LoggerVerbosity.Normal)
|
//new InMemoryLogger(LoggerVerbosity.Normal)
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
Console.SetOut(normalOut);
|
|
||||||
|
|
||||||
string[] targetsToBuild = buildType switch
|
var targetsToBuild = TargetsToBuild(buildType);
|
||||||
{
|
|
||||||
BuildType.Build => ["Restore", "Build"],
|
|
||||||
BuildType.Rebuild => ["Restore", "Rebuild"],
|
|
||||||
BuildType.Clean => ["Clean"],
|
|
||||||
BuildType.Restore => ["Restore"],
|
|
||||||
_ => throw new ArgumentOutOfRangeException(nameof(buildType), buildType, null)
|
|
||||||
};
|
|
||||||
var buildRequest = new BuildRequestData(
|
var buildRequest = new BuildRequestData(
|
||||||
projectFullPath : solutionFilePath,
|
projectFullPath : solutionFilePath,
|
||||||
globalProperties: new Dictionary<string, string?>(),
|
globalProperties: new Dictionary<string, string?>(),
|
||||||
@@ -68,6 +66,33 @@ public class BuildService
|
|||||||
Console.WriteLine($"Build result: {buildResult.OverallResult} in {timer.ElapsedMilliseconds}ms");
|
Console.WriteLine($"Build result: {buildResult.OverallResult} in {timer.ElapsedMilliseconds}ms");
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string[] TargetsToBuild(BuildType buildType)
|
||||||
|
{
|
||||||
|
string[] targetsToBuild = buildType switch
|
||||||
|
{
|
||||||
|
BuildType.Build => ["Restore", "Build"],
|
||||||
|
BuildType.Rebuild => ["Restore", "Rebuild"],
|
||||||
|
BuildType.Clean => ["Clean"],
|
||||||
|
BuildType.Restore => ["Restore"],
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(buildType), buildType, null)
|
||||||
|
};
|
||||||
|
return targetsToBuild;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int GetBuildNodeCount(int processorCount)
|
||||||
|
{
|
||||||
|
var nodesToBuildWith = processorCount switch
|
||||||
|
{
|
||||||
|
1 or 2 => 1,
|
||||||
|
3 or 4 => 2,
|
||||||
|
>= 5 and <= 10 => processorCount - 2,
|
||||||
|
> 10 => processorCount - 4,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(processorCount))
|
||||||
|
};
|
||||||
|
Guard.Against.NegativeOrZero(nodesToBuildWith, nameof(nodesToBuildWith));
|
||||||
|
return nodesToBuildWith;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// To build a single project
|
// To build a single project
|
||||||
|
|||||||
@@ -7,13 +7,15 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<!-- If any Microsoft.Build.dll ends up in the output, it will be prioritised for loading by MSBuild Nodes -->
|
||||||
<PackageReference Include="Ardalis.GuardClauses" Version="5.0.0" />
|
<PackageReference Include="Ardalis.GuardClauses" Version="5.0.0" />
|
||||||
<PackageReference Include="Microsoft.Build" Version="17.14.8" ExcludeAssets="runtime" />
|
<PackageReference Include="Microsoft.Build" Version="17.14.8" ExcludeAssets="runtime" />
|
||||||
|
<PackageReference Include="Microsoft.Build.Framework" Version="17.14.8" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Microsoft.Build.Locator" Version="1.9.1" />
|
<PackageReference Include="Microsoft.Build.Locator" Version="1.9.1" />
|
||||||
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="17.14.8" ExcludeAssets="runtime" />
|
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="17.14.8" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.14.8" ExcludeAssets="runtime" />
|
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.14.8" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.14.0" />
|
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.14.0" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.14.0" />
|
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.14.0" ExcludeAssets="runtime" />
|
||||||
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" />
|
<PackageReference Include="Microsoft.VisualStudio.SolutionPersistence" Version="1.0.52" />
|
||||||
<PackageReference Include="NuGet.Protocol" Version="6.14.0" />
|
<PackageReference Include="NuGet.Protocol" Version="6.14.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
Reference in New Issue
Block a user