简介
Cathage 一直致力于成为给 Cocoa 应用添加框架最简单的方式。
它的使用流程如下:
- 创建一个 Cathage ,在里面列出你的项目要使用的第三方框架;
- 运行 Cathage, Cathage 会获取并创建你列出的所有框架;
- 把生成的
.frameword
二进制文件拖到你的工程文件中。
Cathage 帮你创建第三方依赖、提供二进制的 framework
文件,并且不会改变你的项目架构和创建。 Cathage 在你使用的过程中并不会修改的你工程文件和你的项目设置。
Cathage 与 CocoaPods 的不同
CocoaPods 是存在已久的 Cocoa 的第三方依赖管理方式,在此基础上为什么还要使用 Cathage ?
首先,CocoaPods 会自动为你的应用与第三方依赖创建和更新一个 Xcode workspace;Carthage 使用 xcodebuild
创建二进制 framework
,添加和使用这此框架是用户自己操作的。CocoaPods 使用上更简单,而 Carthage 更灵活,耦合性更低。
从 CocoaPods 的 README 可以看出它有以下的目标:
通过创建一个集中式的生态系统使发现和管理第三方框架更便捷。
相反, Carthage 是一个非集中式的第三方管理工具。它在工程文件中没有集中的列表,这可以大大降低维护的难度,避免集中列表的一些错误导致的编译失败。然而,发现第三方框架也是一个麻烦的事情,用户必须要到 GitHub 的趋势页面去查找或者去类似的网站。
CocoaPods 的工程文件中一定要有 podspec 文件,在 podspec 文件中用户要填写元数据和它创建的方式。Carthage 用 xcodebuild
去创建第三方框架。它不会把你的第三方依赖放在一个单独的 workspace 中去管理,你写的第三方框架一定要包含自己的 Xcode 项目用来描述怎么去生成和使用。
总之,Carthage 的目标就是成为管理第三方框架第简单的工具,它可以在不使用 Xcode 的情况下完成它的任务,也不会让框架作者做额外的工作。但 CocoaPods 也确实提供了很多非常好而且 Carthage 介于成本考虑可能永远也不会有的功能。
安装 Carthage
安装 Carthage 有以下几种方法:
- 通过安装程序安装:下载并运行
Carthage.pkg
,根据软件提示安装即可; - Homebrew安装:使用
brew install carthage
命令安装(注意:如果你安装过二进制版本的 Carthage,你要先删除/Library/Frameworks/CarthageKit.framework
); - 从GigHub源安装:如果你想安装最新版本(注意最新版可以不太稳定),直接克隆Carthage 在GigHub上的 master 分支,并运行
make install
即可,仅支持 Xcode 8.0及以上(Swift支持 2.3 版本,现在还不支持 3.0 以上的版本)。
为应用添加第三方框架
如果你安装了 Carthage ,你就可以为你的项目添加第三方框架了。注意 Carthage 只支持动态库,动态库只在 iOS 8 及以上才支持(任意版本的 OS X 都支持动态库)。
开始使用
针对 iOS, tvOS 或者 watchOS 的使用方法:
- 创建一个
Cartfile
并列出你想使用的第三方库; - 使用
carthage update
命令,Carthage 就会把第三方框架更新到 Carthage/Checkouts 文件夹中,然后挨个编译; - 在你的工程文件的 “General” 选项卡中,把你的框架从 Carthage/Build 文件夹拖到 “Linked Frameworks and Libraries” 区域内;
- 在你的工程文件 “Build Phases” 选项卡中,点 "+" 然后选择 “New Run Script Phase” 创建一个新的运行脚本来声明你的 shell(比如:bin/sh),把下面的内容粘贴到 shell 中:
/usr/local/bin/carthage copy-frameworks
然后在 “Input Files” 中添加你要使用的框架的路径,比如:
$(SRCROOT)/Carthage/Build/iOS/Box.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
当这些调试信息被复制到产品目录中, 无论你的应用停在哪个断点,Xcode 都能够 symbolicate 你的堆栈信息。这也能够让你用第三方的调试工具进行调试。
无论你的应用提交到 AppStore 还是打包测试,Xcode 都会复制这些文件到你应用的 .xcarchive
沙盒中 dSYMs 文件夹的子目录中。
升级第三方框架
如果你修改了 Cartfile 文件,或者你想使用第三方框架的最新版,只要再运行一次 carthage update
就行了。
如果你只是想更新某一个或者某几个,只要用空格隔开就行了,比如:
carthage update Box
或者
carthage update Box Result
Cartfile
Cartfile 是用来描述第三方框架的,它严格遵守 Ordered Graph Data Language 的语法,任何标准的 OGDL 工具都能解析它。
第三方框架声明分为两部分:基础部分和版本需求部分。
基础部分
如果使用 GigHub 的仓库(GitHub.com 或者 GitHub Enterprise),使用时必须加入 github
关键字,比如:
github "ReactiveCocoa/ReactiveCocoa" # GitHub.com
github "https://enterprise.local/ghe/desktop/git-error-translations" # GitHub Enterprise
其他 git 仓库要加 git
关键字,如下:
git "https://enterprise.local/desktop/git-error-translations2.git"
版本需求
Carthage 支持以下几种版本声明:
-
>= 1.0
大于等于版本 1.0 -
~> 1.0
兼容版本 1.0 -
== 1.0
必须是版本 1.0 -
some-branch-or-tag-or-commit
针对一个明确的 Git 项目
如果没有版本声明,就代表任何版本都可以使用。
兼容性是根据语义化版本规范确定的,任何大于或者等于版本 1.5.1 小于版本 2.0 的,都被认定 兼容于 1.5.1。
但是根据语义化版本规范,任何 0.x.y 的版本都会在运行中崩溃,所以0.x 的版本没有遵守语义化版本规范,如果你定义了 0.1.1 的版本,那么 兼容的版本就是 0.1.2,而不是 0.2。
Cartfile 示例
# Require version 2.3.1 or later
github "ReactiveCocoa/ReactiveCocoa" >= 2.3.1
# Require version 1.x
github "Mantle/Mantle" ~> 1.0 # (1.0 or later, but less than 2.0)
# Require exactly version 0.4.1
github "jspahrsummers/libextobjc" == 0.4.1
# Use the latest version
github "jspahrsummers/xcconfigs"
# Use the branch
github "jspahrsummers/xcconfigs" "branch"
# Use a project from GitHub Enterprise
github "https://enterprise.local/ghe/desktop/git-error-translations"
# Use a project from any arbitrary server, on the "development" branch
git "https://enterprise.local/desktop/git-error-translations2.git" "development"
# Use a local project
git "file:///directory/to/project" "branch"