【问题标题】:Android & iOS: How to handle dependencies when building an SDKAndroid & iOS:构建 SDK 时如何处理依赖关系
【发布时间】:2017-04-20 21:12:31
【问题描述】:

我目前正在开发一个可在 Android 和 iOS 平台上使用的 SDK。

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

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

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

因此,这导致我们的 SDK 可能在我们的一个客户端(如果不是两者)上被破坏,因为我们确保它适用于依赖项 X,但不适用于 Y 和 Z。

目前,遗留代码只是简单地导入导致此问题的库的源代码并将其命名空间,这样它就可以模拟我们不使用同一个库。

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

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

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

但是,我不知道这是否正确? 还有其他解决方案吗?

谢谢:)

【问题讨论】:

  • 我不认为你想要达到的目标是可能的。即使您将code 更改为与版本无关,您的库仍然需要准确提及它所依赖的其他库。如果您不指定版本,则将假定为最新版本(至少在 cocoapods 中)。您不能在依赖项下提及同一库的多个版本。除非版本明确创建为同时使用。
  • 但是,您可以做的是制作多个版本的 base sdk,唯一的区别是 dependency 版本。正如您所说,您可以更改您的 基本代码 以支持您计划为其创建单独版本的所有依赖项版本。然后,不同版本的 sdk 之间的唯一区别是 pom/pod 文件提及特定版本的依赖项。您必须维护所有依赖版本组合的矩阵,以便您的客户选择正确的 sdk 版本。
  • 通过上述方法,客户端仍然不能按照您的计划只使用一个单一版本的 sdk,而是可以简单地选择客户端中支持其他依赖版本的版本代码。由于您的 sdk 是通过 maven/cocoapods 添加的,因此更改 sdk 的版本只是客户端依赖配置文件(pom/pod)中的数字更改。它并不理想,但我认为它很接近。
  • 使用cocoa pods添加依赖并将SDK的代码拖到项目中?
  • @lukya 我明白了。实际上,正如您所说,我打算支持多个版本,并指定库默认使用的特定版本。但是这个版本可以被客户在技术上覆盖,谁可以在支持的范围内选择一个版本?但我想它需要大量的工作来支持多个库的多个版本,所以不确定它是否是正确的选择.. 显然这方面的信息很少。您的解决方案很有趣,尽管我猜它似乎很难实现并且让客户感到困惑?

标签: android ios sdk dependencies


【解决方案1】:

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

1.-如果你使用 maven 构建你的库,你可以使用“provided”范围来强制你的库从运行它的容器中获取依赖项。这样,依赖项可以由使用您的库的应用程序提供。请注意,如果依赖项完全不同,这对您没有帮助。

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

【讨论】:

  • 感谢您的回答,基于插件的方法可能非常有趣。它应该在我们的 Android 项目上运行良好,因为我们主要将网络库 volley 作为依赖项。所以我们可以很容易地做一个接口并将它集成为一个插件。我现在主要关心的是 iOS 应用程序:我们有几个小型库作为依赖项(小型设计工具或代码实用程序)。每个插件一个插件肯定会被过度使用。也许我们应该将多个插件合并为一个?你对此有什么想法吗?
  • 只要你保持依赖契约(合并插件消耗相同的冲突依赖),你就可以合并插件。
猜你喜欢
  • 2015-05-11
  • 2021-10-24
  • 2018-10-12
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多