制作一个 dll 引用的 NuGet 包简直是一键完成,无论是不是多框架项目;制作 dotnet-tools 也是如此。但如果需要自定义一些编译步骤,那么就需要在制作 NuGet 包时做很多的特殊处理了。
本文介绍制作适用于多框架项目的 NuGet 工具包时应该注意的问题。
本文内容
背景知识
NuGet 包内的文件夹结构
回顾一下 NuGet 包的文件夹结构:
+ /
+ lib/
+ ref/
+ runtimes/
+ content/
+ build/
+ buildMultiTargeting/
+ buildTransitive
+ tools/
由于涉及到自定义 NuGet 包的代码都写在 build
buildMultiTargeting
和 buildTransitive
中,其他都不涉及到 NuGet 包在编译期间会做的事情,另外,buildTransitive
是用来处理包传递过程中的编译过程的,所以我们本文只说也只需要说 build
和 buildMultiTargeting
。
这里面的代码都是用 Target
写出来的,如果你对此不了解,建议阅读这些博客:
- 理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv
- 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目) - walterlv
制作有自定义功能的 NuGet 包
我之前写过一些关于如何制作各种高级功能的 NuGet 包的博客:
- 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - walterlv
- 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv
- 从零开始制作 NuGet 源代码包(全面支持 .NET Core / .NET Framework / WPF 项目) - walterlv
按照上面的博客制作出来的 NuGet 包其实是适用于单框架项目和多框架项目的,甚至也适用于传统的非 SDK 风格的项目。
关于单框架和多框架项目,就是项目文件中这里的差别:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- 单框架项目 -->
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
</Project>