如何为多个目标框架构建解决方案?
How to build a solution for mutliple target frameworks?
我们有一个目前针对 .NET 4.6.2
的 class 库,它具有一些通过 nuget 解析的依赖项 (SDK classes)。
该 class 库所需的所有 SDK 程序集都可用于多个目标平台(例如 4.6.2
、4.5.2
等)。
我们正在使用 VSTS 构建库并将其 pack/push 到私有 NuGet 提要。
现在,我们需要我们的 Class-Library 同时针对 .NET 4.5.2
和 .NET 4.6.2
,因为我们有一个项目使用这个针对 .NET 4.5.2
的库(不,不幸的是升级它的目标是没有选择的)
所以真正的问题是:有没有办法为两个多目标框架构建解决方案?
到目前为止我尝试了什么:
- 研究了很多,但这个问题似乎并不常见(或者我无法在特定情况下正确地google)
- 对构建变量进行了试验,但这似乎也没有效果
我还考虑过使用某种脚本来解析和操作所有 packages.config
和 *.csproj
文件,但我想这根本不是最佳做法。
实际上,是的,这似乎是可能的,但我从未见过任何相关文档,我自己也没有尝试过。我只是无意中发现了一个使用它的开源项目,并突然意识到这是可能的。
其实很简单:您必须手动编辑 *.csproj
文件,如下所示:
- 将项目转换为新的 sdk 样式格式,就像将其移植到 .NET Standard 一样(文档根目录应为
<Project Sdk="Microsoft.NET.Sdk">
)
- 而不是
<TargetFramework>net452</Targetframework>
,只需写<TargetFrameworks>net452;net462</TargetFrameworks>
如果您在 Visual Studio 中打开此类项目的属性页面,您会看到目标平台的字段是只读的,因此(目前)还没有直接支持它。作为生成过程的结果,您将获得指定生成输出路径的多个子文件夹,其中包含单独目录中所有指定目标平台的程序集。
拥有可供针对不同版本 .Net Framework 的项目使用的 assembly/class 库非常容易。
如果您有针对 4.5.2 和 4.6.2 的项目,但您想要提供一个公共库,那么让您的库针对 4.5.2。 .Net make 本质上是向后兼容的,因此您始终可以使用针对低于使用 library/project 目标版本的库。 从技术上讲,您也可以定位低于该值的任何内容,包括 3.5,但为什么要这么做。
这也适用于 .Net Core 和 .Net Standard,但这些组合很快就会叠加起来。如果库以 .Net Standard 1.0 为目标,那么它可以被以任何版本的 .Net Standard >= 1.0、任何版本的 .Net Core >= 1.0 和任何版本的 .Net Framework >= 4.5.2 为目标的项目使用。查看docs on .Net Standard了解详情。
有关 .Net Standard 的更多详细信息,请查看 this blog post from Daniel Crabtree
我们有一个目前针对 .NET 4.6.2
的 class 库,它具有一些通过 nuget 解析的依赖项 (SDK classes)。
该 class 库所需的所有 SDK 程序集都可用于多个目标平台(例如 4.6.2
、4.5.2
等)。
我们正在使用 VSTS 构建库并将其 pack/push 到私有 NuGet 提要。
现在,我们需要我们的 Class-Library 同时针对 .NET 4.5.2
和 .NET 4.6.2
,因为我们有一个项目使用这个针对 .NET 4.5.2
的库(不,不幸的是升级它的目标是没有选择的)
所以真正的问题是:有没有办法为两个多目标框架构建解决方案?
到目前为止我尝试了什么:
- 研究了很多,但这个问题似乎并不常见(或者我无法在特定情况下正确地google)
- 对构建变量进行了试验,但这似乎也没有效果
我还考虑过使用某种脚本来解析和操作所有 packages.config
和 *.csproj
文件,但我想这根本不是最佳做法。
实际上,是的,这似乎是可能的,但我从未见过任何相关文档,我自己也没有尝试过。我只是无意中发现了一个使用它的开源项目,并突然意识到这是可能的。
其实很简单:您必须手动编辑 *.csproj
文件,如下所示:
- 将项目转换为新的 sdk 样式格式,就像将其移植到 .NET Standard 一样(文档根目录应为
<Project Sdk="Microsoft.NET.Sdk">
) - 而不是
<TargetFramework>net452</Targetframework>
,只需写<TargetFrameworks>net452;net462</TargetFrameworks>
如果您在 Visual Studio 中打开此类项目的属性页面,您会看到目标平台的字段是只读的,因此(目前)还没有直接支持它。作为生成过程的结果,您将获得指定生成输出路径的多个子文件夹,其中包含单独目录中所有指定目标平台的程序集。
拥有可供针对不同版本 .Net Framework 的项目使用的 assembly/class 库非常容易。
如果您有针对 4.5.2 和 4.6.2 的项目,但您想要提供一个公共库,那么让您的库针对 4.5.2。 .Net make 本质上是向后兼容的,因此您始终可以使用针对低于使用 library/project 目标版本的库。 从技术上讲,您也可以定位低于该值的任何内容,包括 3.5,但为什么要这么做。
这也适用于 .Net Core 和 .Net Standard,但这些组合很快就会叠加起来。如果库以 .Net Standard 1.0 为目标,那么它可以被以任何版本的 .Net Standard >= 1.0、任何版本的 .Net Core >= 1.0 和任何版本的 .Net Framework >= 4.5.2 为目标的项目使用。查看docs on .Net Standard了解详情。
有关 .Net Standard 的更多详细信息,请查看 this blog post from Daniel Crabtree