2011-09-09 58 views
32

我想分发框架A.框架A取决于框架B.我想我的框架的用户只需要包含框架A,但仍然有框架B的编程访问。为什么伞架不鼓励?

苹果一直这样做采用“伞框架”的概念,但这个主题中的文档:

不要创建伞框架

虽然可以使用Xcode的雨伞框架来创建,做 所以对大多数德是不必要的velopers,不建议。 Apple 使用伞形框架来掩盖操作系统中的 库之间的一些相互依赖关系。在几乎所有情况下,您应该是 能够将您的代码包含在单个标准框架包中。 或者,如果您的代码是足够模块化的,则可以创建多个框架,但在这种情况下,模块之间的依赖关系最小或不存在,因此不应保证为其创建一个保护伞。

为什么这种方法不鼓励?是什么使它成为苹果相互依赖的框架问题的一个很好的解决方案,但不适合我的?

+0

我也想知道这一点。使用git存储库设置自动构建,依赖项目中的符号链接,框架/头部搜索路径以及所有有趣的东西可以在框架和项目数量增长时变得非常麻木。 – Minthos

+7

假设没有证据表明伞架* *是“针对Apple问题的一个很好的解决方案”。我的不知情的观点是,情况正好相反:将iOS与较旧的OSX或较新版本的OSX比较为旧版本,我发现诸如CoreGraphics这样的框架将雨伞移动到独立框架中。我认为“雨伞”这个概念对缓解可可成长的痛苦来说是一个很好的概念,但从来没有成为“解决苹果问题的好办法”。也许他们警告你远离陷入同样的​​混乱中。 – Quuxplusone

+0

我投票结束这个问题作为题外话题,因为这个话题太旧了。 目前,iOS SDK 8.0及以上版本提供了动态框架和swift语法。所以,这个问题不再有用。 – AechoLiu

回答

43

如果您是所有涉及的框架的唯一分销商,则伞形框架才有意义,并且您将将所有框架打包在一起,作为将一起升级的单个版本化的包。如果那是你的情况,那很好,但这是非常不寻常的情况。在可可开发的世界里,除了苹果之外,任何人都会遇到这种情况。

第一点,如果您是给定框架的唯一分销商,伞形框架才有意义。例如,假设您希望将libcurl作为您的伞形框架的一部分。现在其他一些打包商也希望将libcurl作为其伞架的一部分。现在我们有一个链接时间冲突,可能导致链接错误或更糟,未定义的运行时行为。我自己追逐了这些。他们非常不愉快。避免这种情况的唯一方法是每个框架/库只有一个版本。伞形框架鼓励相反。

即使您只是将自己的代码分解为子代,这意味着其他供应商可能会在您自己的伞架中使用您的子框架,导致同样的问题。记住,如果你说你可以作为第三方来使用伞架,那么其他厂商也可以。

第二点,伞架只有在控制所有子架构的版本控制时才有意义。试图修补一个相互依赖的框架集几乎总是我的经验中的一场灾难。

由于OS系统的大小和无处不在,OS供应商有一种不寻常的情况。在一个规模上有意义的事情往往对另一个规律没有意义。 NSResponder对此完全正确。当您提供完整的数千个软件包环境时,权衡是不同的,这些环境是为该平台编写的每个程序的基础。但即使是苹果公司也只有少量的大型框架,而且它们总是围绕它们提供的库和包装版本进行包装。这主要是为了简化开发人员的工作,否则他们不得不追逐数十个图书馆和框架来编译某些东西。没有第三方有这种情况,所以第三方很少需要这种解决方案。要求你的客户连接两个库是完全不同的,然后让他们链接20.如果你提供了20个框架,它们一起工作并且你控制了,那么你可能应该使用一把伞,但是也许你有太多的框架第三方。

我在这里讨论的大部分内容都是关于OS X的。在iOS上,这对第三方来说不是问题。静态库绝不能链接其他静态库,因为肯定会发生冲突。

理论上,我在这里讨论的大部分问题都是链接器的基本技术限制。链接器没有很好的方法来管理多个版本的库,因此碰撞是一个严重的问题。 .NET程序集试图提供更多的灵活性。我对.NET开发不够熟悉,无法说明这是否成功。我对大型多组件系统的经验是,更简单,不太灵活的解决方案对于大多数问题是最好的。 (但是,草地总是更绿色....)

+0

很好的解释,谢谢:) – Minthos

+0

如果我只想让我的框架使用第三方框架呢?我如何确保*我的用户也链接到它? – zneak

+2

通过指示您的用户包含并链接到它。使用动态库(OS X和iOS 8),可以自己链接到系统级框架。但是第一个第三方框架,唯一明智的做法是在应用程序开发人员的控制下,在应用程序级别完成所有链接。要为你的调用者自动链接,必须有一个依赖管理系统,并且没有内置的.CocoaPods提供了一个,如果你和你的调用者都选择使用它。但是某些东西必须在应用程序级别处理依赖性。你不能从你的调用者的框架中做到这一点。 –

1

在苹果公司的情况下,他们提供了大量的代码,并且这些子框架经常单独修订。如果您提供了几个框架的演示,那么您可能想要继续并构建一个伞形框架。如果没有,你可能不需要麻烦。

+3

这使得它看起来只是一个规模问题。如果这对于许多框架来说是一个很好的解决方案,那么为什么不是几个框架的好解决方案呢?这就好像说如果你有大量的代码,OO设计只是一个好主意。是的,这对于这种情况非常有用,但即使你只有一对夫妇上课也很好。 –

+1

如果一艘集装箱船能很好地解决大量的货物问题,为什么它对于几袋杂货来说也不是一个好的解决方案? – NSResponder

+4

看,我真的不想在这里发生类比战争。我的主要问题是:我想分配多个框架作为一个框架。苹果有一个很好的解决方案,但他们不鼓励它的使用。为什么?这个问题的一个很好的答案会告诉我什么是一个伞形框架的问题,使其仅适用于Apple的框架。你的答案解释了为什么伞架对苹果有利,但你不能解释他们为什么对我不利。 –

5

一个问题是,框架B的版本现在绑定到框架A的版本。这可能是你在某些情况下而不是其他人的情况。如果框架B可能被一个也想使用框架A的应用程序独立使用,那么应用程序可能会发现自己处于A包含的B版本不是它需要或想要的版本的情况。

框架B是一个应用程序可以独立于A使用的框架吗?如果是这样,那么你可能会遇到这种情况。如果B是A以外不可用的框架,那么您不应该遇到这种情况。

+0

这是一个很好的观点,谢谢。在我的情况下,这不是一个问题,但我当然可以看到这是一个因素。 –

相关问题