NuGet:强制项目在netstandard

时间:2017-08-14 19:55:07

标签: nuget .net-standard

短版

我创作了一个针对.NET Standard 1.3和1.6的软件包。我的1.6构建引用System.Runtime.Loader。这个包有一个placeholder用于MonoAndroid框架,这意味着我的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版本中获得减少的功能 - 但我无法弄清楚如何通过.NET Standard 1.6强制NuGet选择这个框架。

我目前的包裹结构如下:

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包?

1 个答案:

答案 0 :(得分:0)

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

我对NuGet应该如何工作的一切都是正确的。问题是NuGet似乎缓存了包依赖关系,所以当我重建我的包时,它仍然使用旧的依赖列表。令人讨厌的是,这只是一个内部缓存 - Visual Studio UI显示我的新包的依赖关系被正确识别,但日志显示正在安装的旧依赖项。

解决方案是清除每个重新包装之间的NuGet缓存。