若是说 CocoaPods 像一个航母, 包罗万象, 坚实稳固. 那么 Carthage 就像一艘巡洋舰, 机动灵活, 攻击迅速. 1html
CocoaPods是已存在很长时间的Cocoa依赖管理器, 那么为何要建立Carthage呢?
1) CoaoaPods 是一套总体解决方案,咱们在 Podfile 中指定好咱们须要的第三方库。而后 CocoaPods 就会进行下载,集成,而后修改或者建立咱们项目的 workspace 文件,这一系列总体操做。
2) 相比之下,Carthage 就要轻量不少,它也会一个叫作 Cartfile 描述文件,但 Carthage 不会对咱们的项目结构进行任何修改,更很少建立 workspace。它只是根据咱们描述文件中配置的第三方库,将他们下载到本地,而后用 xcodebuild 构建成 framework 文件。而后由咱们本身将这些库集成到项目中。Carthage 使用的是一种非侵入性的哲学。git
Carthage 基本的工做流程:
1> 建立一个Cartfile,包含你但愿在项目中使用的框架的列表
2> 运行Carthage,将会获取列出的框架并编译它们
3> 将编译完成的.framework二进制文件拖拽到你的Xcode项目当中
Carthage编译你的框架/库,而后提供该框架的二进制文件,但你仍然持有该项目结构和设置的绝对控制。Carthage不会自动的修改你的项目文件或编译设置。github
相信你们可能遇到这种状况, Podfile中配置好相关框架/库
-> pod install -verbose -no-repo-update
, 而后编译运行时, 出现相似错误:bootstrap
diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: No such file or directory
接下来又是一系列的折腾, 白白浪费不少时间.swift
CocoaPods 有以下优点: xcode
① 使用方便, 除编写 Podfile 之外其余几乎都是自动完成;
② 软件包数量多,主流支持;
③ 支持 iOS 8 Framework,固然也支持旧的静态编译.服务器
可是 CocoaPods 做为一个有中心仓库的解决方案,缺点也比较明显:app
1⃣️ 每次更新环境都须要链接到中心仓库,比较耗时;
2⃣️ 开发者使用比较简单,可是若是建立兼容 CocoaPods 的库,就会相对繁琐一些(尽管有了命令行);
3⃣️ 每次干净编译都会把全部第三方库都从新编译一次框架
Carthage 的优点: 工具
① 使用 Carthage 的话,全部的第三方库依赖,除非是更新的须要,否则日常
干净编译 Project,它是不须要再次编译
的,大大加快日常编译及 Archive 的时间.
② 它是去中心化
的,没有中心服务器. 这意味着每次配置和更新环境,只会去更新具体的库,而不会有一个向中心服务器获取最新库的索引这么个过程,如此又省了不少时间.
③ CocoaPods 无缝集成!一个项目可同时使用两套包管理工具
, 当前 CocoaPods 管理主要 Framework 的配置下, 将少许其余 Framework 交给了 Carthage 管理, 两者能够和谐地共存.
④ 结构标准的项目自然就是 Carthage 库
.
Carthage 的不足:
1⃣️ 库依然不如 CocoaPods 丰富:尽管不少库不须要声明并改造就直接能够被 Carthage 用,但依然有大量 CocoaPods 能用的库不支持,我相信时间能解决这个问题;
2⃣️只支持 Framework,因此是 iOS 8 Only
了,随着时间推移,这个也不会是问题;
3⃣️ 工具仍不完善:在使用过程当中,发现它没法在一个结构复杂的项目中正确发现库(好比有 iOS, Mac demo + framework 的结构);
4⃣️ 没法在 Xcode 里定位到源码:若是你在写代码过程当中,想跳转到一个第三方库去看具体的实现,这是没法办到的,Carthage 的配置只能让你看到一个库的头文件
1. 建立一个"Cartfile",将你想要使用的框架列在里面 2. 运行"carthage update",将获取依赖文件到一个Carthage.checkout 文件夹,而后编译每一个依赖 3. 在你的应用程序target的 'General' 设置标签中的 'Embedded Binaries' 区域,将框架从"Carthage.build文件夹拖拽进去"。
在这个过程中,Carthage将建立一些build artifacts,其中最重要的是Cartfile.lock
文件,里面将列出每一个框架的具体版本,确保你提交了这个文件到版本控制工具里面(如Git、SVN),由于每一个用到项目的人都须要它来编译相同版本的框架。
完成上面的步骤并提交你的修改,项目的其余用户就只须要获取该仓库并执行carthage bootstrap
就能使用你所添加的框架。
添加框架到单元测试或另外一个框架
使用Carthage添加框架到任意目标的方法,和添加到应用程序差很少。主要的不一样在于框架是如何设置并连接到Xcode的。
由于非应用程序目标没有“Embedded Binaries”设置区域,你须要将编译完成后的框架拖拽到“Link Binaries With Libraries”的区域里。
在某些稀有案例中,你也许会想要复制每一个依赖到已编译的项目中(好比,在外部框架中嵌入依赖,或确保依赖在测试工具中正常显示)。想要达到这个目的,你须要建立一个新的“Copy Files”编译选项和“Frameworks”组,而后将框架的引用添加到里面。
升级框架
若是你修改了Cartfile,或者你想升级到框架的最新版本(取决于你指定的需求版本),执行 carthage update
命令能够达到目的。
让你的框架支持Carthage
Carthage只正式支持动态框架,动态框架可以在任何版本的OS X上使用,但只能在iOS 8及以上版本使用。
由于Carthage拥有非中心化的包列表,以及没有项目指定的编译设置,大多数框架应该能自动编译。
分享你的Xcode schemes
Carthage将只从你的.xcodeproj 中标记为已分享的Xcode schemes来编译。若是你想检查编译是否成功,执行carthage build --no-skip-current
命令,而后检查Carthage.build文件夹。
若是当执行命令但有scheme没有被编译,打开Xcode并肯定对应scheme被标记为“Shared”,以便Carthage可以发现它。
解决编译失败
若是你在执行carthage build --no-skip-current
时编译失败,尝试执行xcodebuild -scheme SCHEME -workspace WORKSPACE build
或 xcodebuild -scheme SCHEME -project PROJECT build
(将其中的大写单词换成你项目的对应名称),而后观察是否有相同的失败发生,这应该能生成足够的失败信息来解决问题。
[5]Carthage:Xcode项目的GitHub依赖管理器 -- http://www.infoq.com/cn/news/2015/05/carthage-dependency-manager
引用源🔽
1:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另外一种敏捷轻快的 iOS & MAC 开发体验"
2:http://swiftcafe.io/2015/10/25/swift-daily-carthage-package/) "SwiftCafe -- Carthage 包管理工具,另外一种敏捷轻快的 iOS & MAC 开发体验"
3:https://imtx.me/archives/1939.html "TUALATRIX -- Carthage 初探:四大优点与四大劣势"
4:https://github.com/Carthage/Carthage#adding-frameworks-to-an-application "GitHub.com"