2017-08-14 57 views
0

短版的NuGet:强制项目选择了更为具体的目标框架在netstandard

我创作一个包,面向.NET标准1.3和1.6。我的1.6版本参考文献System.Runtime.Loader。这个软件包有一个用于MonoAndroid框架的placeholder,这意味着我的NuGet软件包现在无法在Android 7.x项目中加载。

我的.NET标准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 Framework 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 1.3标准建立我的项目,而不是1.6构建,由于System.Runtime.Loader包中的占位符项目而无法恢复?

+0

如果存在更具体的目标框架,NuGet应该选择比netstandard更具体的目标框架。如果这没有发生,那么我将捕获NuGet输出并在http://github.com/nuget/home/issues –

+0

@Chris上打开一个错误,当您更改为打包以包含“MonoAndroid”的dll时,您是否也更新nuspec以包括mono android版本的依赖组?另外,在这种情况下它应该是'MonoAndroid10'。 –

+0

@MartinUllrich我做到了。我注意到生成的nuspec将'MonoAndroid10'(我输入的)的tfm更改为'MonoAndroid1.0' - 我不知道这里是否有任何关联。 – Chris

回答

0

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

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

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