能否通过单个Cartfile为多Target管理Carthage依赖?
单个Cartfile管理多Target依赖:Carthage的实现方式
当然可以!Carthage完全支持用单个Cartfile来统一管理项目中所有Target的依赖,不过它的运作逻辑和CocoaPods有所不同——毕竟Carthage是预编译二进制框架的思路,不会像CocoaPods那样直接修改你的项目配置、注入源码依赖。下面我来一步步说明怎么实现你要的效果:
1. 编写统一的Cartfile
把所有Target需要的依赖都集中写在项目根目录的Cartfile里,不用拆分到各个Target目录。对应你给出的CocoaPods示例,Cartfile会是这样:
github "ReactiveX/RxSwift" ~> 4.0 github "ReactiveX/RxCocoa" ~> 4.0 github "ReactiveX/RxTest" github "ReactiveX/RxBlocking" github "Quick/Nimble" github "QueryKit/QueryKit" github "Alamofire/Alamofire" github "RxSwiftCommunity/RxAlamofire" github "RxSwiftCommunity/RxRealm" ~> 0.7.1 github "realm/realm-cocoa" ~> 3.10
2. 编译所有依赖
在终端执行以下命令,Carthage会自动拉取并编译所有依赖的二进制框架,最终会存放在项目根目录的Carthage/Build文件夹中:
carthage update --platform iOS # 或者用bootstrap(适合首次搭建或依赖无变更时) carthage bootstrap --platform iOS
3. 为每个Target关联对应依赖
这一步是Carthage和CocoaPods的核心区别:CocoaPods会自动帮你把依赖绑定到指定Target,但Carthage需要你手动为每个Target关联它需要的框架:
- 打开Xcode项目,选中需要添加依赖的Target,进入
General标签页 - 在
Linked Frameworks and Libraries区域,点击+按钮,从Carthage/Build/iOS目录下选择该Target需要的框架(比如CleanArchitectureRxSwift需要RxCocoa.framework、RxSwift.framework、QueryKit.framework) - 为了确保框架能被正确打包到APP中,还需要在该Target的
Build Phases里添加一个Copy Filesphase:- 点击
+选择Copy Files,设置Destination为Frameworks - 把该Target依赖的框架添加到这个phase中,或者更高效的方式是添加
Run Scriptphase,执行carthage copy-frameworks命令,并在Input Files里列出所有需要复制的框架路径(比如$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework)
- 点击
为什么这种方式能满足你的需求?
集中管理单个Cartfile的优势和你想的一样:
- 所有依赖版本统一维护,不用在多个文件里重复修改版本号
- 更新依赖时只需要执行一次
carthage update,所有框架都会同步编译 - 便于追踪整个项目的依赖树,排查版本冲突也更方便
虽然Carthage没有CocoaPods那种def代码块来批量注入依赖的语法,但通过单个Cartfile+手动关联Target的方式,完全能实现你要的集中维护效果。
内容的提问来源于stack exchange,提问作者iamyogish
相关产品推荐
相关产品推荐

