如果您是所有涉及的框架的唯一分销商,则伞形框架才有意义,并且您将将所有框架打包在一起,作为将一起升级的单个版本化的包。如果那是你的情况,那很好,但这是非常不寻常的情况。在可可开发的世界里,除了苹果之外,任何人都会遇到这种情况。
第一点,如果您是给定框架的唯一分销商,伞形框架才有意义。例如,假设您希望将libcurl作为您的伞形框架的一部分。现在其他一些打包商也希望将libcurl作为其伞架的一部分。现在我们有一个链接时间冲突,可能导致链接错误或更糟,未定义的运行时行为。我自己追逐了这些。他们非常不愉快。避免这种情况的唯一方法是每个框架/库只有一个版本。伞形框架鼓励相反。
即使您只是将自己的代码分解为子代,这意味着其他供应商可能会在您自己的伞架中使用您的子框架,导致同样的问题。记住,如果你说你可以作为第三方来使用伞架,那么其他厂商也可以。
第二点,伞架只有在控制所有子架构的版本控制时才有意义。试图修补一个相互依赖的框架集几乎总是我的经验中的一场灾难。
由于OS系统的大小和无处不在,OS供应商有一种不寻常的情况。在一个规模上有意义的事情往往对另一个规律没有意义。 NSResponder对此完全正确。当您提供完整的数千个软件包环境时,权衡是不同的,这些环境是为该平台编写的每个程序的基础。但即使是苹果公司也只有少量的大型框架,而且它们总是围绕它们提供的库和包装版本进行包装。这主要是为了简化开发人员的工作,否则他们不得不追逐数十个图书馆和框架来编译某些东西。没有第三方有这种情况,所以第三方很少需要这种解决方案。要求你的客户连接两个库是完全不同的,然后让他们链接20.如果你提供了20个框架,它们一起工作并且你控制了,那么你可能应该使用一把伞,但是也许你有太多的框架第三方。
我在这里讨论的大部分内容都是关于OS X的。在iOS上,这对第三方来说不是问题。静态库绝不能链接其他静态库,因为肯定会发生冲突。
理论上,我在这里讨论的大部分问题都是链接器的基本技术限制。链接器没有很好的方法来管理多个版本的库,因此碰撞是一个严重的问题。 .NET程序集试图提供更多的灵活性。我对.NET开发不够熟悉,无法说明这是否成功。我对大型多组件系统的经验是,更简单,不太灵活的解决方案对于大多数问题是最好的。 (但是,草地总是更绿色....)
我也想知道这一点。使用git存储库设置自动构建,依赖项目中的符号链接,框架/头部搜索路径以及所有有趣的东西可以在框架和项目数量增长时变得非常麻木。 – Minthos
假设没有证据表明伞架* *是“针对Apple问题的一个很好的解决方案”。我的不知情的观点是,情况正好相反:将iOS与较旧的OSX或较新版本的OSX比较为旧版本,我发现诸如CoreGraphics这样的框架将雨伞移动到独立框架中。我认为“雨伞”这个概念对缓解可可成长的痛苦来说是一个很好的概念,但从来没有成为“解决苹果问题的好办法”。也许他们警告你远离陷入同样的混乱中。 – Quuxplusone
我投票结束这个问题作为题外话题,因为这个话题太旧了。 目前,iOS SDK 8.0及以上版本提供了动态框架和swift语法。所以,这个问题不再有用。 – AechoLiu