如何防止安装不是 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
我知道 .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