如何配置 NCrunch 以便它可以构建 Blazor 项目

How to configure NCrunch so that it can build a Blazor project

当 NCrunch(版本 4.2.0.7)尝试构建 Blazor 项目(版本 3.0.0-preview9)时,它会产生以下错误:

packages\microsoft.aspnetcore.blazor.build.0.0-preview9.19465.2\targets\Blazor.MonoRuntime.targets (441, 5): The command "dotnet "C:\Users\Rodolfo.nuget\packages\microsoft.aspnetcore.blazor.mono.0.0-preview9.19462.2\build\netstandard1.0../../tools/illink/illink.dll" -l none --disable-opt unreachablebodies --verbose --strip-security true --exclude-feature com --exclude-feature sre -v false -c link -u link -b true -d (... lots of files here...) exited with code -532462766.

如何让 NCrunch 构建 Blazor 项目?

免责声明:我在网上找不到单一答案(包括 SO)后才写这个问题。我已经找到了解决方案并打算自己回答这个问题,以便 - 希望 - 帮助其他人。

TL;DR

  1. 转到 Blazor 项目的 NCrunch 配置。
  2. 添加一个名为 BlazorLinkOnBuild自定义构建 属性(自 3.2.0-preview3 起,重命名为 BlazorWebAssemblyEnableLinking) 值为 false.


完整解释 ...以防细节发生变化。

在报错信息中提到的.targets文件的第441行可以找到导致报错的Exec命令:

<Exec Command="dotnet &quot;$(MonoLinkerPath)&quot; $(_BlazorLinkerAdditionalOptions) @(_BlazorFolderLookupPaths, ' ') -o &quot;$(BlazorIntermediateLinkerOutputPath)&quot; @(_BlazorAssemblyDescriptorFiles, ' ') @(_BlazorAssembliesToLink, ' ')"  />

此命令包含在以下目标中:

<Target
  Name="_LinkBlazorApplication"
  Condition="$(_BlazorShouldLinkApplicationAssemblies) != ''"
  Inputs="$(BlazorBuildLinkerInputsCache);
          @(IntermediateAssembly);
          @(_BlazorDependencyInput);
          @(BlazorLinkerDescriptor)"
  Outputs="$(BlazorIntermediateLinkerResultFilePath)"
>

这意味着只有当 _BlazorShouldLinkApplicationAssemblies 属性 不为空时才会执行 Exec。在 .targets 文件中搜索此内部 属性 的设置位置,您将找到此 PropertyGroup(第 152 行):

<PropertyGroup Label="Build properties">
  <_BlazorShouldLinkApplicationAssemblies Condition="$(BlazorLinkOnBuild) == 'false'"></_BlazorShouldLinkApplicationAssemblies>
  <_BlazorShouldLinkApplicationAssemblies Condition="$(BlazorLinkOnBuild) == 'true'">true</_BlazorShouldLinkApplicationAssemblies>
  <_BlazorBuiltInBclLinkerDescriptor>$(MSBuildThisFileDirectory)BuiltInBclLinkerDescriptor.xml</_BlazorBuiltInBclLinkerDescriptor>
</PropertyGroup>

这就是为什么要设置 BlazorLinkOnBuild(从 3.2.0-preview3 开始,重命名为 BlazorWebAssemblyEnableLinking) 到 false 允许 NCrunch 构建项目。