通过 Nuget 使用 .NET Standard 和 VS2017 分发自定义 MSBuild 任务

Distribute custom MS Build Task with .NET Standard and VS 2017 via Nuget

我有一个 .NET Standard 库 (1.4) VS 2017 项目,其中包含需要通过 Nuget 包分发的自定义 MS Build 任务 (MyTask)(假设 MyCustomTask.dll,它包含 MyTask 和 Portable.targets 将由目标项目导入)

目标 .NET Standard (1.4) 项目 cspro 文件随后使用这个带有自定义生成任务的 Nuget 包来导入调用自定义生成任务的 Portable.targets。

然而,此时我不断收到构建错误 无法加载文件或程序集 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。

我试过 .NET Standard(1.4、1.5 和 1.6)但同样的错误。

问题在于消费应用程序 MSBuild.exe 在这种情况下,需要包含 运行 网络标准任务所需的所有转发程序集(例如,取决于 NETStandard.Library) .

这种情况下的最佳解决方案是将任务库多目标定位到 .net 框架和 .net 标准目标框架:

<TargetFrameworks>netstandard1.6;net46</TargetFrameworks>

想法是有 2 个包含任务的 dll。在 NuGet 包中包含的项目文件中,而不是直接在 <UsingTask> 中使用 dll 路径,想法是使用基于 $(MSBuildRuntimeType) 属性 的不同 dll 文件,这将是 Core 在 .NET Core 版本的 MSBuild 上:

<PropertyGroup>
  <_CustomTaskAssemblyTFM Condition="'$(MSBuildRuntimeType)' == 'Core'">netstandard1.6</_CustomTaskAssemblyTFM>
  <_CustomTaskAssemblyTFM Condition="'$(MSBuildRuntimeType)' != 'Core'">net46</_CustomTaskAssemblyTFM>
  <_CustomTaskAssembly>$(MSBuildThisFileDirectory)..\tools$(_CustomTaskAssemblyTFM)\CustomTaskAssemblyName.dll</_CustomTaskAssembly>
</PropertyGroup>

<UsingTask TaskName="SomeCustomTask" AssemblyFile="$(_CustomTaskAssembly)" />

您可以在 asp.net core build tools and the .NET Core SDK 中看到这方面的示例。