我知道.Net Core 2有一个兼容性填充程序,允许它使用不专门针对.Net Core/Standard 2的Nuget包。这使它可以访问 Nuget 的 70%。很棒 - 不错的功能。
如何防止安装与 .Net Core 2/.Net Standard 2 不完全兼容的 nuget 包?或者在安装时警告我它正在与垫片一起使用?
我创建了一个安装了EF 6.1.3的新.Net Core 2.0项目(我知道它不起作用(,没有什么可以阻止我或警告它在安装时不以.Net Standard <=2为目标。
我很高兴"用剪刀运行",但我觉得在将 MVC5 和 EF 6.1.3 安装到 .Net Core 2 应用程序中之前,我应该收到警告。我真的很想防止初级开发人员安装不受支持的软件包等。
我想进一步的 Matt Ward 回答 - 我的主要观点是 - 是否可以检测到某些东西在安装时实际上是 100% 兼容的,或者我们总是处于需要自己确定软件包工作"足够好"的情况下。我希望有一种技术机制可以检测到缺少的覆盖 API 覆盖率,并且可以告诉我们 nuget 包可能无法像以前那样运行。所以我想 MS 说 70% 的兼容性 - 如果我尝试安装 30%,我想失败
将实体框架 6.1.3 安装到 .NET Core 2.0 项目中,"错误"窗口中有一个 NU1701 警告,有关使用 .NET Framework 4.6.1 还原实体框架 6.1.3,并且它可能不完全兼容。
可以将 NU1701 警告转换为项目中的错误,以便无法安装任何不显式支持 .NET Core 2.0 的 NuGet 包。这可以通过将 WarningAsErrors 属性添加到项目中来完成。
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<WarningsAsErrors>NU1701</WarningsAsErrors>
</PropertyGroup>
然后,如果尝试安装实体框架 6.1.3,还原将失败,更改将回滚,并且不会安装 NuGet 包。
还可以将 DisableImplicitAssetTargetFallback 属性设置为 true,这将阻止将 .NET 4.6.1 添加到 AssetTargetFallback 属性,该属性在检查 NuGet 包与 .NET Core 2.0 项目的兼容性时使用。
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DisableImplicitAssetTargetFallback>true</DisableImplicitAssetTargetFallback>
</PropertyGroup>
如果要 100% 确定,请针对 .NET 可移植性分析器和 .NET Standard 2.0 配置文件运行包。
它不会告诉您是否会调用 API(并且绝不是自动过程(,只是如果程序集包含任何与 .NET Standard 2.0 不兼容的 API。
但是,您也只能针对分析器运行应用程序,因为 .NET 可移植性分析器应该能够跟踪从应用程序所做的任何引用并检查这些引用。
更新
你可以将其构建到生成服务器管道中,以获得更自动的保证。
.NET 可移植性分析器文档。
Visual Studio不是必需的,只需从 https://github.com/Microsoft/dotnet-apiport/releases 下载并运行
即可从文档中:
- 键入以下命令以分析当前目录:
...ApiPort.exe analyze -f .
- 若要分析.dll文件的特定列表,请键入以下命令:
...ApiPort.exe analyze -f first.dll -f second.dll -f third.dll
旧答案(可能与马特的答案相辅
相成(未经测试,但试一试:
<!-- old dotnet tooling/.NET Core 1.x -->
<PackageTargetFallback>netstandard2.0;portable-net45+win8</PackageTargetFallback>
<!-- new dotnet tooling/.NET Core 2.0 -->
<AssetTargetFallback>netstandard2.0;portable-net45+win8</AssetTargetFallback>
通常你想让它像
<!-- old dotnet tooling/.NET Core 1.x -->
<PackageTargetFallback>$(PackageTargetFallback);dotnet5.6;portable-net45+win8</PackageTargetFallback>
<!-- new dotnet tooling/.NET Core 2.0 -->
<AssetTargetFallback>$(AssetTargetFallback);dotnet5.6;portable-net45+win8</AssetTargetFallback>
$(PackageTargetFallback)
将告诉 MSBuild 保留旧值并将之后的值附加到其中。但是,由于$(PackageTargetFallback)
可能(现在无法查看/深入挖掘(具有 .NET Framework 名字对象,因此您将使用自己的值覆盖它。
此外
鉴于PackageTargetFallback
现已弃用,应改用AssetTargetFallback
。
据我所知,.Net 可移植性分析工具无法 100% 确定不支持安装的平台,例如 system.runtime.Loader,经过工具分析,100% 支持框架平台,但不支持
分析结果的屏幕截图:分析系统.运行时.加载器