iOS开发——Carthage:去中心化的Cocoa依赖管理器

若是说 CocoaPods 像一个航母, 包罗万象, 坚实稳固. 那么 Carthage 就像一艘巡洋舰, 机动灵活, 攻击迅速. 1html

Why to use Carthage? 2

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

Carthage or CocoaPods? 3

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 的配置只能让你看到一个库的头文件

Installing Carthage 开始使用:4

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 buildxcodebuild -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"

相关文章
相关标签/搜索