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

如何在没有冲突的情况下使用开源iOS库?,ios,json,Ios,Json,我正在编写一个iOS库(SDK),需要JSON解码支持。有很多选择,但问题是上游冲突 如果我将JSONKit添加到我的库中,而另一个第三方库也这样做,那么想要同时使用我的库和另一个库的上游用户将遇到冲突 这样看来,由于存在冲突的风险,我不可能将任何第三方库添加到我的库中。如何将iOS库用作我的依赖项,而不给上游开发人员造成冲突?我们也遇到了同样的问题。下面是我对如何解决这个问题的想法(也许我们可以一起找出一个可靠的解决方案)。对于版本控制,我们使用Git: 一种选择是简单地在库中的所有类前面加

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

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


这样看来,由于存在冲突的风险,我不可能将任何第三方库添加到我的库中。如何将iOS库用作我的依赖项,而不给上游开发人员造成冲突?

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

  • 一种选择是简单地在库中的所有类前面加上您自己的标识符。在这种情况下,即使类是JSONKit的一部分,我仍然会在它前面加上我自己的标识符(“JG”)以获得类名“JGJSONKit.h”。以这种方式,发生碰撞的可能性要小得多

    这种方法有一个缺点,即如果第三方存储库(如JSONKit)被更新,那么将这些更改引入我们库的JSONKit版本会更加困难

    但是,如果打算将此代码导出为静态库(因为您仍然可以完全控制代码,并且可以手动将更改拉到第三方存储库并适当重命名它们,如果您在静态库的未来更新中选择这样做的话),那么这是可以接受的

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

想法

编辑:

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

1) 根据本教程,我们将共享代码(我们编写的,而不是第三方编写的)封装到一个具有静态库目标的项目中,并将共享资源(XIB和图像)封装到一个捆绑包中:

2) 我们创建了一个Git存储库,其中包括上述静态库和捆绑包

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

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

总而言之,该解决方案对我们来说近乎完美:

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


我希望这也能帮助您的工作!

我看过JSONKit,我发现它不是一个静态库,而是一个要复制到项目中的src文件

项目中的所有类等必须以(cough)全局唯一的两个字母前缀作为前缀,包括从internet复制和粘贴的类

如果JSONKit是一个库,你会更好。你的库将依赖于JSONKit,但不包含它,这将取决于使用你的库构建应用程序的人,以确保JSONKit也包含在内并链接到库中-无冲突(尽管分发一个依赖于其他第三方库的库,而这些第三方库不是您要分发的,这本身就有点棘手)

如果其他人将此JSONKit文件粘贴到他们的库中,然后分发它们,那么您只有两种选择*

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

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

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

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

我如何使用iOS库作为我的依赖项,而不会对上游开发人员造成冲突

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


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

您是否使用Git进行版本控制?我们的代码目前在一个私有Git repo中。这有关系吗?在某种程度上,是的……我会给出一个答案,并说明我的想法(我们正面临与您类似的问题)。上游开发人员报告说,他们使用JSONKit会导致问题,因为最终会产生重复的定义。我相信这是编译时错误。您的意思是,您提供的头带有已编译的静态库,并且您提供的头也包含在JSONKit头中的定义吗?前缀是一个开始,也是一种方法我现在正在学习。但是有几个问题。首先,仅仅给类加前缀是不够的。哟