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 缓存。
精简版
我编写了一个针对 .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 缓存。