一个 iOS(或 OS X)项目依赖于一个框架的两个版本

Posted

技术标签:

【中文标题】一个 iOS(或 OS X)项目依赖于一个框架的两个版本【英文标题】:An iOS (or OS X) project depends on two versions of a framework 【发布时间】:2016-04-27 20:28:54 【问题描述】:

我正在编写一个依赖于 Alamofire v3.x 的 swift 框架。现在我想将我的框架添加到一个依赖于 Alamofire v2.x 的项目中。我正在使用 Carthage 来管理我的项目。似乎不可能在一个项目中添加同一框架的两个版本。有没有办法解决这种情况?

【问题讨论】:

如果两个框架版本试图写入一个公共位置的数据库但每个版本都需要不同的架构怎么办?你不能保证同一个框架的两个版本(不是你写的)可以互操作,所以你不应该像这样混合和匹配框架版本。使用其中一种。 @par 感谢您的评论。事实上,我想发布一个依赖于 Alamofire v3.x 的框架,但如果我的用户在他们的项目中使用 Alamofire v2.x 怎么办? 同样的问题。现在 Alamofire 特别是 可能跨版本兼容(我不知道),但如果你的库中有第三方依赖项,你需要告诉你的用户他们也必须使用该版本,如果它也是他们的依赖。只需考虑同一框架的两个版本之间的共享资源,您就会明白为什么事情不可避免地会中断(以意想不到的、令人讨厌的方式)。 @par 我认为解决问题的价值,依赖地狱,远远超过你提到的边缘情况。不解决依赖地狱要么要求框架开发人员不使用依赖项并自己编写所有代码,要么要求框架使用者手动进行依赖版本不匹配解决。这两种情况看起来都很可怕。 【参考方案1】:

你遇到的叫做依赖地狱。 .NET、Node 等运行时已经解决了这个问题。 Java,至少最多 8 个,只会选择它在运行时找到的第一个版本,并希望所有其他包都可以使用它;他们没有。

CocoaPods 可以在pod install 期间为您检测依赖地狱和错误,仅此而已。我认为迦太基也是如此?然后你的框架的用户被困在这里和那里降级依赖,直到你的框架和其他依赖的框架都使用相同版本的共享依赖。截至目前,这仍然是我们 AFAIK 唯一可用的选择。

Apple 通过Framework versioning 解决了依赖地狱问题。框架将捆绑自身的多个版本,并且在针对框架链接时,链接器将记录所需版本的完整路径(版本在路径中)。但是一个框架将多个版本捆绑在一起曾经是并且现在是一个非常愚蠢的想法,因此从未成功。

【讨论】:

以上是关于一个 iOS(或 OS X)项目依赖于一个框架的两个版本的主要内容,如果未能解决你的问题,请参考以下文章

ld:未找到框架架构 x86_64 的条纹

如何在 iOS 中构建一个 Cocoa 触控框架?

与 Swift 一起使用的 iOS/Mac OS 流畅匹配框架?

XCode:iPhone 目标依赖于 Mac OS X 目标

适用于 iOS 和 Mac OS X 的 MacBinary 转换器

iOS 和 OS X 目标的通用预编译标头