如何防止安装不是 100% .Net Core 2.0 兼容的 nuget 包?

How do I prevent installing nuget packages that aren't 100% .Net Core 2.0 compatible?

我知道 .Net Core 2 有一个兼容性垫片,允许它使用不专门针对 .Net Core/Standard2 的 Nuget 包。这让它可以访问 70% 的 Nuget。很棒 - 不错的功能。

如何防止安装与 .Net Core 2/.Net Standard 2 不完全兼容的 nuget 包?或者在安装时警告我它正在与 shim 一起使用?

我创建了一个新的 .Net Core 2.0 项目并安装了 EF 6.1.3(我知道它不起作用)并且没有什么能阻止我或警告它没有针对 .Net Standard <=2安装。

我很高兴 "run with scissors" 但我觉得我应该在将 MVC5 和 EF 6.1.3 安装到 .Net Core 2 应用程序之前收到警告。我真的很想阻止初级开发人员安装不受支持的软件包等。

我想进一步了解 Matt Ward 的回答 - 我的主要观点是 - 是否可以检测到某些东西在安装时实际上是 100% 兼容的,或者我们是否总是处于需要自己确定软件包有效的情况 "well enough"。我希望有一种技术机制可以检测到覆盖率缺失 API 并且可以告诉我们 nuget 包可能无法像以前那样运行。所以我猜 MS 说 70% 兼容性 - 如果我尝试安装 30%

我想失败

如果您想 100% 确定,运行 针对 .NET Portability Analyzer 和 .NET Standard 2.0 配置文件的软件包。

它不会告诉您 API 是否会被调用(并且绝不是一个自动过程),只是如果程序集包含任何 API 不是 .NET标准 2.0 兼容。

但是,您也只能 运行 您的 应用程序 针对分析器,因为 .NET 可移植性分析器应该能够跟踪应用程序的任何引用,并且也检查这些。

更新

您也可以将它构建到您的构建服务器管道中,以获得更自动的保证。

The .NET Portability Analyzer Docs.

Visual Studio 不是必需的,只需从 https://github.com/Microsoft/dotnet-apiport/releases 和 运行

下载即可

来自文档:

  • Type the following command to analyze the current directory: \...\ApiPort.exe analyze -f .
  • To analyze a specific list of .dll files, type the following command: \...\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) 可能(现在不能 look/dig 更深入)在那里有 .NET Framework 绰号,您将用自己的值覆盖它。

另外

鉴于 PackageTargetFallback 现已弃用,应改用 AssetTargetFallback

正在将 Entity Framework 6.1.3 安装到 .NET Core 2.0 项目中,关于 Entity Framework 6.1.3 正在使用 .NET Framework 4.6 恢复的错误 window 中有一个 NU1701 警告.1 并且它可能不完全兼容。

您可以将 NU1701 警告变成项目中的错误,这样您就无法安装任何未明确支持 .NET Core 2.0 的 NuGet 包。这可以通过将 WarningAsErrors 属性 添加到项目中来完成。

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp2.0</TargetFramework>
  <WarningsAsErrors>NU1701</WarningsAsErrors>
</PropertyGroup>

那么如果你尝试安装Entity Framework 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>

据我所知.Net portability analyzer工具不能100%判断不支持安装的平台,比如system.runtime.Loader,经过工具分析,100%支持framework平台,但是确实如此不是

Screenshot of analysis results:analyse System.Runtime.Loader