Jon*_*ood 4 .net nuget nuget-package .net-core .net-5
我发布了几十个 NuGet 包。大多数目标是 .NET Standard。Visual Studio 使我每次编译时更新这些包变得非常容易。
现在,我想升级这些包以充分利用 .NET 5.0。但我希望那些无法升级到 .NET 5.0 的人仍然可以使用现有的。另外,我不想创建全新的包,这样我每个包都有两个版本。
如果我没记错的话,一个 NuGet 包可以面向多个框架版本,我认为 Visual Studio 在安装到项目中时会自动加载正确的版本。但是,创建多个包目标并未融入 Visual Studio。
不知道这里有没有NuGet包专家。我想了解有关这是否可行的信息,完成它的最简单方法是什么,如何处理版本控制等。有什么好书或文章参考吗?
补充说明
我知道我可以在项目级别定位多个框架(使用TargetFrameworks项目文件中的元素)。但是我必须填充我的代码 if #if, else,endif块以利用每个目标框架。我不认为我想要这个。我的库方法签名将更改以利用诸如可空字符串之类的东西。我希望能够自由地做到这一点,而无需为所有内容创建多个版本。
要走的路绝对是<TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>在你的csproj. 然后还启用可空值并设置LangVersion为 v9.0。
完成此操作后,根据您现有的代码,您可能必须根据目标调整代码,因为 .NET 5 的所有内容都不会在裸 .Net Standard 2 中受支持...
然而,虽然我怀疑你能否完全摆脱#if守卫,但有一些解决方案。
首先我们需要区分之后出现的3种新奇事物netstandard2.0(即.NET 4.6.1和.NET Core 2.1时代之后)。
Span<T>)需要最新的 CLR。如果 nuget 包必须支持 .NET Standard 2 目标,那么这些是您想要避免的(至少在公共接口中)。现在,让我们看看我们可以做些什么来避免太多#if. 第一个去的地方是csproj:
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net5.0</TargetFrameworks>
<!-- enable the feature but without warning for legacy frameworks to avoid false positives. -->
<Nullable>annotations</Nullable>
<!-- enable the feature including warnings only on top of the most recent framework you target. -->
<!-- it will serve as a reference for warnings for all others. -->
<Nullable Condition="'$(TargetFramework)' == 'net5.0'">enable</Nullable>
<LangVersion>9.0</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
netstandard2.0和net5.0.9.0这样我可以使用所有最新的花里胡哨Nullable有点复杂,但基本上,它可以防止针对netstandard2.0目标弹出警告,同时完全支持.net5.0目标。然后让我们添加这两个神奇的nuget包:
<ItemGroup>
<PackageReference Include="IsExternalInit" Version="1.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Nullable" Version="1.3.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
这 2 个软件包由同一个人提供(请参阅此处和此处)。它们是仅开发依赖项,因此不会污染依赖链下游的消费者。他们所做的只是声明支持可空值和记录所需的属性(作为内部类,以免与合法类冲突)。
通过此设置,您现在可以在代码库中使用记录和可空值,并且它将成功编译到两个目标。
如果您从net5.0客户端使用程序集,一切都会按预期工作。然后,如果您从.NET 4.8程序集使用它,事情也将没问题:当然,您不会有可空警告或智能感知,并且记录将被视为常规类,但我会说它会很好地降级。
对于最后一种功能,真正依赖于运行时的功能,#if如果您想使用它们,您将别无选择。假设您想用Span<T>...替换一些基于数组的代码,您需要提供两个私有实现并#if根据目标选择正确的一个(请参阅https://docs.microsoft.com/en-us/dotnet /standard/frameworks#how-to-specify-a-target-framework以获取支持的预处理器常量列表)。
我没有详尽地介绍 .NET Standard 2 和 .NET 5 之间发生的所有变化(这可能是一本书),但这应该可以帮助您入门。我敢肯定,一个功能一个功能,聪明的人找到了解决方案,如果可能的话,将它们填充到旧版本的 .NET。
如果你想看一看,我还将我的测试场推送到这个github 存储库。
最后一点,我想说最重要的事情是进行彻底的测试,以确保对代码库进行现代化改造不会破坏老客户的任何东西。
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |