Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓&;iOS:构建SDK时如何处理依赖关系_Android_Ios_Sdk_Dependencies - Fatal编程技术网

Android 安卓&;iOS:构建SDK时如何处理依赖关系

Android 安卓&;iOS:构建SDK时如何处理依赖关系,android,ios,sdk,dependencies,Android,Ios,Sdk,Dependencies,我目前正在开发一个SDK,它可以在Android和iOS平台上使用 对于Android,我们在Gradle文件中列出依赖项,并使用Maven提供SDK(因此我们的依赖项列在.pom文件中) 对于iOS,我们使用cocoapod来处理依赖项 问题如下: *我们的SDK在版本X中使用依赖项 *我们的一个客户端可能使用相同的依赖项,但版本为Y *另一个客户端也可能在版本Z中使用完全相同的依赖项 因此,这可能会导致我们的SDK在一个客户端(如果不是两个)上被破坏,因为我们确保它与依赖项X一起工作,而不是

我目前正在开发一个SDK,它可以在Android和iOS平台上使用

对于Android,我们在Gradle文件中列出依赖项,并使用Maven提供SDK(因此我们的依赖项列在.pom文件中)

对于iOS,我们使用cocoapod来处理依赖项

问题如下: *我们的SDK在版本X中使用依赖项 *我们的一个客户端可能使用相同的依赖项,但版本为Y *另一个客户端也可能在版本Z中使用完全相同的依赖项

因此,这可能会导致我们的SDK在一个客户端(如果不是两个)上被破坏,因为我们确保它与依赖项X一起工作,而不是与Y和Z一起工作

目前,遗留代码只是导入了导致此问题的库的源代码并对其命名,这样它就模拟了我们不使用同一个库

但在我看来,这不是一个合适的解决方案:我们没有最新的修复程序,更新很痛苦,客户端的库是库的两倍而不是一倍

所以,现在,我正在考虑一个潜在的好的解决方案,但在谷歌上找不到我想要的(也许我没有使用正确的关键字:/)

我考虑的是为每个依赖项提供一系列版本的支持。有点像“如果这个方法在这里,就执行它,否则就使用以前版本的那个方法”(比如iOS上的selector respondTo)。然后,客户机应该能够在支持范围内的条件下使用依赖项的任何版本

然而,我不知道这是不是正确的方式? 还有其他解决办法吗


谢谢:)

对于android,有两种可能的解决方案,一种是基于构建工具的解决方案,另一种是基于架构的解决方案:

1.-如果使用maven构建库,可以使用“提供的”范围强制库从运行它的容器获取依赖项。这样,依赖关系可以由使用库的应用程序提供。请注意,如果依赖项大不相同,这将无助于您


2.-去营救!您可以将项目细分为主库和插件库。主库将向用户显示每个类的一个方法,这将是他们从应用程序调用的方法。在主库中,所有类都将以间接形式导入每个外部SDK或依赖项(可以是抽象类或接口的通用包装器),并以这种方式使用它们。例如,您可能正在提供增强的facebook登录UI。然后,您将引用facebookLoginInterface并调用它,而不是直接在视图中引用FacebookSDK。然后,您将有一个二级项目facebookLogin41,其中您将使用facebook sdk 4.1实现facebookLoginInterface,第二个项目facebookLogin418,其中您将使用facebook sdk 4.1.8实现相同的接口。然后,实现某种提供逻辑,如依赖注入框架(Roboguice提供程序是一个很好的例子)、maven依赖范围(例如提供的)等,以使库实例成为facebookLoginInterface。最后,客户端只导入所需的主库和辅助项目,并使用主库

我认为你想达到的目标是不可能的。即使您将
code
更改为独立于版本,您的库仍然需要确切地说明它所依赖的其他库。如果未指定版本,则将采用最新版本(至少在cocoapods中)。不能在依赖项下提及同一库的多个版本。除非明确创建的版本是同时使用的。但是,您可以做的是创建多个基本sdk版本,唯一的区别是
依赖关系
版本。正如您所说的,您可以更改基本代码以支持您计划为其创建单独版本的依赖项的所有版本。然后,sdk的不同版本之间的唯一区别是pom/pod文件,其中提到了依赖项的特定版本。您必须维护一个包含所有依赖版本组合的矩阵,以便您的客户端选择正确的sdk版本。使用上述方法,客户端仍然不能按照您的计划仅使用sdk的一个版本,而只能选择支持客户端代码中其他依赖版本的版本。由于您的sdk是通过maven/cocoapods添加的,因此更改sdk的版本只是对客户端的依赖项配置文件(pom/pod)进行数字更改。这并不理想,但我认为它已经结束了。使用cocoa pods添加依赖项并将SDK的代码拖到project中?@lukya我明白了。实际上,正如您所说,我计划支持多个版本,并指定库默认使用的特定版本。但是这个版本在技术上可以被可以选择支持范围内的版本的客户端覆盖?但是我想它需要大量的工作来支持多个库的多个版本,所以不确定它是否是正确的选择。。显然,关于这方面的信息很少。你的解决方案很有意思,虽然它看起来很难实现,我猜对客户端来说也很混乱?谢谢你的回答,基于插件的方法可能非常有趣。它应该在我们的Android项目上工作得很好,因为我们主要依赖于网络库。因此,我们可以轻松地创建一个接口,并将其集成为插件。我现在主要关心的是iOS应用程序:我们有几个小型库作为依赖项(小型设计工具或代码实用程序)。每一个插件都有一个插件,这绝对是多余的。也许我们应该把多个插件合并成一个?你对此有什么想法吗?只要你保持依赖契约(合并使用相同冲突依赖项的插件),你就可以很好地合并插件。