6

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

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

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

4

3 回答 3

2

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

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

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

于 2012-09-19T07:27:35.337 回答
1

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

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

    这种方法的缺点是应该更新第三方存储库(例如 JSONKit),但是,将这些更改拉入我们库的 JSONKit 版本更加困难。

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

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

想法?

编辑:

这是我们提出的解决方案:

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

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

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

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

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

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

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

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

于 2012-09-18T18:57:05.393 回答
0

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

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

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

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

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

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

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

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

于 2012-09-18T22:02:53.407 回答