我正在开发一个名为Silicon的静态库,我将其用于所有iOS应用。
因为我不想创建一个可能难以维护的大型静态库,所以我创建了许多较小的静态库,并将其作为子模块附加。
截至撰写本文时,Silicon的依赖关系树如下:
Silicon
|
| ==> FDKeychain
| ==> FDDataClient
|
| => FDRequestClient
|
| => FDFoundationKit
| ==> FDSQLiteDatabase
|
| => FDFoundationKit
正如您所看到的,FDRequestClient和FDSQLiteDatabase都将FDFoundationKit作为通用静态库。
似乎发生的事情是,当构建使用Silicon的项目时,它会将所有Silicon的目标依赖项构建到项目构建目录中。 FDDataClient和FDSQLiteDatabase也会发生同样的事情。因此,在某些时候,FDRequestClient的FDFoundationKit会被构建并复制到构建目录以及FDSQLiteDatabase中的FDFoundationKit。无论哪一个建立最后只是覆盖前一个。
仅凭纯粹的运气FDFoundationKit并没有以任何严肃的方式改变,以至于FDRequestClient和FDSQLiteDatabase不能总是使用相同的版本,但我无法保证它会永远像这样。
我想弄清楚Silicon是否有办法指定使用哪个版本的FDFoundationKit,因此Silicon可以确保所使用的版本适用于FDRequestClient,FDSQLiteDatabase以及我添加的任何其他依赖项在将来。
我知道CocoaPods试图解决这个问题,但我不想让某人为了让我的图书馆工作而必须设置所有这些。如果我能找到某种方式让硅片定义使用哪种版本的FDFoundationKit,那么一切都会完美无缺。
答案 0 :(得分:0)
您可以(像我们一样)将所有库放入框架中,因为框架支持版本控制。框架只是以通用方式配置的目录树。 Xcode不直接支持框架的创建,因此您必须在脚本中创建它们,通常作为构建阶段的最后一个。您可以在IOS- framework
找到一个示例(感谢jverkoey
)
在框架中,您可以在
中存储每个静态库的所有版本myLibrary.framework->Versions->n.n folders.
myLibary.framework->Versions->Current
是指向最新版本文件夹的链接。
由于您使用的是静态库,因此Silicon本身无法指定版本(需要动态库),但是用于构建Silicon的构建,链接器或环境标志当然可以。
以这种方式,默认情况下,Apps将始终使用最新版本的库,但链接的实际版本可能会在构建时被链接器标记轻松覆盖。此外,所有用户都将以与任何其他框架相同的方式在其项目中包含Silicon框架,因此对开发人员来说非常简单。
答案 1 :(得分:0)
这个问题看起来只有两个答案:
1)使用像CocoaPods或Carthage这样的依赖管理器。
2)您发布的任何静态库或框架都不应具有任何目标依赖项。它们应该链接到您拥有的任何依赖项,并且集成库的人员也有责任集成所需的依赖项。