如何在没有冲突的情况下使用开源iOS库?

时间:2012-09-18 15:40:38

标签: ios json

我正在编写iOS库(SDK),我需要JSON解码支持。有很多选择,但问题是上游碰撞。

如果我将JSONKit添加到我的库中,而另一个第三方库也这样做,那么想要同时使用我的库和其他库的上游用户将会遇到冲突。

然后,由于存在冲突的风险,我不可能将任何第三方库添加到我的库中。如何在不对上游开发人员造成冲突的情况下使用iOS库作为我的依赖项?

3 个答案:

答案 0 :(得分:2)

  

如何在不对上游开发人员造成冲突的情况下使用iOS库作为我的依赖项?

只需指定第三方库是您的库的依赖项,提供项目的相应链接,以及任何必要的说明,版本信息等。

如果该软件包/发行版不适合分发(例如,它们只有一堆源文件),那么创建一个包含适当静态库目标的公共项目(fork)。

答案 1 :(得分:1)

我们遇到同样的问题。这是我对如何解决它的想法(也许我们可以一起找出一个强大的解决方案)。对于版本控制,我们使用Git:

  • 一个选项是简单地为库中的所有类添加您自己的标识符。在这种情况下,即使该类是JSONKit的一部分,我仍然用它自己的标识符(“JG”)作为前缀来获取类名“JGJSONKit.h”。通过这种方式,发生碰撞的可能性要小得多。

    此方法的缺点是应该更新第三方存储库(例如JSONKit),但是,将这些更改提取到我们库的JSONKit版本中会更加困难。

    但是,这可能是可以接受的,如果此代码旨在作为静态库导出(因为您仍然可以完全控制代码,并且您可以手动将更改提取到第三方存储库和如果您应该在将来更新静态库时选择这样做,请适当地重命名它们。

  • 我考虑的另一个选择是使用Git子模块。如果您的库是开源的(或者至少是有权访问它的开发人员的开源 - 不一定公开可用),这个解决方案似乎更好。在这种情况下,开发人员可以选择简单地包含他们已在自己的项目中使用的任何子模块。

想法?

修改

以下是我们提出的解决方案:

1)在本教程之后,我们将共享代码(我们编写的非第三方)封装到一个带有静态库目标和共享资源(xib和图像)的项目中:

https://github.com/jverkoey/iOS-Framework

2)我们创建了一个包含所述静态库和bundle的Git存储库。

3)我们分叉了所有想要的第三方库(因此我们可以根据需要对它们进行更改)并且还将原始repos添加为每个分叉仓库中的另一个远程(因此,如果要在上游进行更改,我们可以轻松地将它们拉出来进入我们自己的叉子)

4)我们将 -objc 添加到“其他链接器”标记(重要),以便所有类别在运行时都能正常工作。

总而言之,解决方案对我们来说非常完美:

我们通过隐藏第三方库来避免冲突(将它们包含在公共标题中但是私有),或者我们警告那些库在项目中用于公开暴露的标题和那些开发人员不应该再次添加它们(它们可以使用已经包含的代码,通过简单的通过所述Git子模块方法包含它们来保持最新)

我希望这也有助于你的努力!

答案 2 :(得分:0)

我看了一下JSONKit,我发现它不是一个静态库,它是一个复制到你的项目中的src文件。

项目中的所有课程等都必须以您的(咳嗽)全球唯一的双字母前缀为前缀,包括您复制并粘贴互联网的课程。

如果JSONKit是一个库,你会更好。您的库将依赖于JSONKit,但不包含它,并且由您的库构建应用程序以确保JSONKit也被包含并链接 - 没有冲突(尽管分发依赖于其他第三方的库)不属于你的图书馆本身就有点棘手)。

如果其他人将此JSONKit文件粘贴到他们的库中然后分发它们,则只有两个选项*

修改JSONKit.h& .m,为所有符号添加前缀(必须对包含在源代码中的任何代码执行此操作) 或选择其他东西(NSJSONSerialization?)。

这并不意味着您不能拥有第三方库依赖项(或者这样做是危险的),只是将源文件复制到项目中与添加库依赖项不同。

* arghh,ok 3 ..你可以弱连接JSONKit中的所有符号,并将其留给库用户提供JSONKit.m,但问题仍然是其他库..

TLDR ..避免使用JSONKit,它不适合在您要分发的库中使用“原样”。