NuGet:强制项目选择更具体的目标框架而不是 netstandard

NuGet: Force project to chose more specific target framework over netstandard

精简版

我编写了一个针对 .NET Standard 1.3 和 1.6 的包。我的 1.6 构建引用 System.Runtime.Loader。此包具有用于 MonoAndroid 框架的 placeholder,这意味着我的 NuGet 包现在无法加载到 Android 7.x 项目中。

我的 .NET Standard 1.3 版本没有这个依赖项。我如何强制 NuGet 为 Android 项目加载 netstandard-1.3 版本,而不是 netstandard-1.6?

更多详情

当我尝试在使用 project.json 的 Android 7 项目中加载我们当前的包时,我看到以下错误消息:

System.Runtime.Loader 4.3.0 provides a compile-time reference assembly for System.Runtime.Loader on MonoAndroid,Version=v7.1, but there is no run-time assembly compatible with win.

我的理解是,这是由于 System.Runtime.Loader NuGet package 对许多目标框架使用占位符造成的。这个包的结构是这样的:

lib -> netstandard1.5 -> System.Runtime.Loader.dll
       MonoAndroid10  -> _._

我还打包了我的包的 netstandard-1.3 版本,它没有引用 System.Runtime.Loader 程序集。我很高兴 Android 用户在 1.3 版本中获得减少的功能 - 但我不知道如何强制 NuGet 在 .NET Standard 1.6 上选择这个框架。

我当前的包结构如下:

lib -> netstandard1.3 -> build13.dll
       netstandard1.6 -> build16.dll

我试图将其更改为以下内容 - 以强制 NuGet 选择更具体的目标框架,但 NuGet 似乎更喜欢 netstandard1.6 而不是 MonoAndroid。 (我也试过 MonoAndroid10)

lib -> netstandard1.3 -> build13.dll
       MonoAndroid    -> build13.dll
       netstandard1.6 -> build16.dll

有没有什么办法,作为包作者,我可以强制我的下游用户的 Android 项目使用我的项目的 .NET Standard 1.3 版本,而不是 1.6 版本,后者无法恢复由于 System.Runtime.Loader 包中的占位符项目?

我最终发现这是一个缓存问题。

我对 NuGet 工作方式的所有假设都是正确的。问题是 NuGet 似乎缓存了包依赖项,因此当我重建我的包时,它仍在使用旧的依赖项列表。恼人的是,这只是一个内部缓存 - Visual Studio UI 看起来我的新包的依赖项被正确识别,但日志显示正在安装旧的依赖项。

解决方案是在每次重新打包之间清除 NuGet 缓存。