Android和iOS:在构建SDK时如何处理依赖关系

5
我目前正在开发一个SDK,该SDK可在Android和iOS平台上使用。
对于Android,我们在Gradle文件中列出依赖项,并使用Maven提供SDK(因此我们的依赖项在.pom文件中列出)。
对于iOS,我们使用cocoapods处理依赖项。
问题是: * 我们的SDK使用版本X的依赖项 * 我们的客户之一可能使用相同的依赖项,但是版本为Y * 另一个客户也可能使用相同的依赖项,但是版本为Z
因此,这导致我们的SDK在其中一个客户端(如果不是两个客户端)上可能会出现问题,因为我们确保它与依赖项X一起工作,但不与Y和Z一起工作。
目前,旧代码只是导入了引起此问题的库源代码并进行了命名空间处理,以模拟我们不使用相同库。
但是在我看来,这不是一个适当的解决方案:我们没有最新的修复程序,更新很痛苦,客户端有两倍的库而不是一个。
因此,目前,我正在尝试考虑一个潜在的好解决方案,但是在Google上找不到我想要的东西(也许我没有使用正确的关键字 :/)。
我想到的是为每个依赖项提供版本范围的支持。有点像“如果这个方法在这里,请执行它,否则,请使用上一个版本的那个方法”(就像iOS上的选择器respondTo)。然后,客户端应该能够在支持范围内使用任何版本的依赖项。
但是,我不知道这是否是正确的方式? 还有其他解决方案吗?
谢谢 :)

我不认为你想要实现的目标是可能的。即使你将你的 code 更改为与版本无关,你的库仍然需要明确指出它依赖于哪些其他库。如果你不指定版本,最新版本将被默认使用(至少在Cocoapods中如此)。你不能在依赖项中提及同一库的多个版本,除非这些版本明确设计用于同时使用。 - Swapnil Luktuke
然而,您可以制作多个版本的基本sdk,唯一的区别是依赖项版本。正如您所说,您可以更改基本代码以支持您计划创建单独版本的所有依赖项版本。然后,各种版本的sdk之间唯一的区别将是pom/pod文件中指定依赖项特定版本的内容。您将需要维护一个矩阵,其中包含所有依赖项版本组合的组合,以供客户选择正确的sdk版本。 - Swapnil Luktuke
通过上述方法,客户端仍然不能像您计划的那样只使用一个版本的sdk,但可以选择支持客户端代码中其他依赖项版本的版本。由于您的sdk是通过maven/cocoapods添加的,因此更改sdk版本只是客户端依赖配置文件(pom/pod)中的数字更改。虽然不是理想的解决方案,但我认为它已经很接近了。 - Swapnil Luktuke
使用 CocoaPods 添加依赖并将 SDK 代码拖到项目中? - jhd
我明白:/ 我们没有太多的依赖。在Android上,我们依赖于Volley,一个网络库。在iOS上,我们使用一些UI库。问题是这些库很受欢迎,许多客户已经在他们的项目中使用了不同版本的库。在某些情况下,这可能会导致冲突...因此,即使我们没有太多的依赖,它们对于我们的SDK正常工作来说是必要的。 - Simon Ninon
显示剩余3条评论
1个回答

2

对于Android平台,有两种可能的解决方案,一种是基于构建工具的,另一种是架构层面的:

1. 如果您使用Maven构建您的库,您可以使用“provided”作用域来强制您的库从运行它的容器中获取依赖项。这样,依赖关系可以由使用您的库的应用程序提供。请注意,如果依赖关系非常不同,则无法帮助您。

2. 抽象化救了您!您可以将项目细分为主要库和插件库。主要库将向用户显示每个类和方法,并且那将是他们从其应用程序调用的内容。在主要库中,所有类都将以间接形式导入每个外部SDK或依赖项,即通用包装器,可以是抽象类或接口,并以此方式使用它们。例如,也许您正在提供增强型Facebook登录UI。然后,您将不会直接将Facebook SDK 引用到您的视图中,而是将引用FacebookLoginInterface并调用它。然后,您将拥有一个辅助项目FacebookLogin41,在其中使用Facebook SDK 4.1实现FacebookLoginInterface,并且第二个是FacebookLogin418,在其中使用相同的接口使用Facebook SDK 4.1.8进行实现。然后,实现某种提供逻辑,例如依赖注入框架(Roboguice提供商是很好的例子)、Maven依赖范围(例如提供的范围)等,以使库实例为FacebookLoginInterface。最后,客户端只需导入所需的主要库和辅助项目,并使用主要库即可。


谢谢你的回答,基于插件的方法可能非常有趣。由于我们主要依赖网络库Volley,因此它应该在我们的Android项目中很好地工作。因此,我们可以轻松地创建一个接口并将其集成为插件。我现在最关心的是iOS应用程序:我们有几个小型库作为依赖项(无论是小型设计工具还是代码实用程序)。每个都使用一个插件肯定会过度。也许我们应该将多个插件合并为一个?你对此有什么想法吗? - Simon Ninon
只要您遵守依赖契约(合并使用相同冲突依赖项的插件),合并插件就不会有问题。 - Fco P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接