我正在努力理解为什么有时由于Xamarin平台应用程序无法从其共享的(.NET Standard)项目中解决NuGet间接依赖关系而陷入这种情况的原因。
这种情况:
我扩展了已经构建和部署的跨平台(iOS,Android和UWP)NuGet程序包。新功能要求共享(.NET Standard)代码库项目对System.IdentityModel.Tokens.Jwt
有新的依赖性。 System.IdentityModel.Tokens.Jwt
依次具有Microsoft.IdentityModel.Tokens
和Microsoft.IdentityModel.JsonWebTokens
的依赖关系。
我建立了代码库; .NET Standard 2.0(共享)代码库和iOS,Androind和UWP的三个平台库。一切都很好,所以我更新了.nuspec并将System.IdentityModel.Tokens.Jwt
添加到<group targetFramework=".NETStandard2.0">
的{{1}}子节中,然后打包.nuget。
接下来,为确保一切正常,我将.nuget“部署”到本地文件夹(已将其设置为用于测试目的的nuget源),然后为我的四个测试应用程序项目(.Net标准,iOS,Android和UWP)。共享的.Net Std lib项目构建良好,因此我尝试构建平台之一,例如Android应用程序。我现在收到此错误:
<dependencies>
我检查了Android应用程序项目的Can not resolve reference: `Microsoft.IdentityModel.Tokens`, referenced by `(my package)`
文件,这是nuget输出:
project.assets.json
问题是,(我的包裹)对 "(my package name)": {
"type": "package",
"dependencies": {
"Xamarin.Forms": "4.0.0"
},
"compile": {
"lib/MonoAndroid10/(my package name).Android.dll": {},
"lib/MonoAndroid10/(my package name).dll": {}
},
"runtime": {
"lib/MonoAndroid10/(my package name).Android.dll": {},
"lib/MonoAndroid10/(my package name).dll": {}
}
},
以外的其他包裹也有依赖性,例如System.IdentityModel.Tokens.Jwt
和Xamarin.Essentials
。反过来,它们又依赖于其他NuGets,依此类推。由于某种原因,这似乎根本不是问题。根据我的读物(https://docs.microsoft.com/en-us/nuget/concepts/dependency-resolution),Visual Studio会找出所有依赖关系,并构建一个依赖关系图,然后将其展平并写入每个项目的System.Text.Json
。为什么某些(大多数,显然是)软件包可以完全解决而另一些却不能?
我通过简单地将所有麻烦的引用直接添加到.nuspec文件的每个平台目标部分来“解决”了问题,但我不知道为什么甚至有必要这样做。
有人吗?