通过 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 中看到这方面的示例。
我有一个 .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 中看到这方面的示例。