简介

Cathage 一直致力于成为给 Cocoa 应用添加框架最简单的方式。
它的使用流程如下:

  1. 创建一个 Cathage ,在里面列出你的项目要使用的第三方框架;
  2. 运行 Cathage, Cathage 会获取并创建你列出的所有框架;
  3. 把生成的 .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 的使用方法:

  1. 创建一个 Cartfile 并列出你想使用的第三方库;
  2. 使用 carthage update 命令,Carthage 就会把第三方框架更新到 Carthage/Checkouts 文件夹中,然后挨个编译;
  3. 在你的工程文件的 “General” 选项卡中,把你的框架从 Carthage/Build 文件夹拖到 “Linked Frameworks and Libraries” 区域内;
  4. 在你的工程文件 “Build Phases” 选项卡中,点 “+” 然后选择 “New Run Script Phase” 创建一个新的运行脚本来声明你的 shell(比如:bin/sh),把下面的内容粘贴到 shell 中:
1
/usr/local/bin/carthage copy-frameworks

然后在 “Input Files” 中添加你要使用的框架的路径,比如:

1
2
3
$(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 就行了。

如果你只是想更新某一个或者某几个,只要用空格隔开就行了,比如:

1
carthage update Box

或者

1
carthage update Box Result

Cartfile

Cartfile 是用来描述第三方框架的,它严格遵守 Ordered Graph Data Language 的语法,任何标准的 OGDL 工具都能解析它。

第三方框架声明分为两部分:基础部分和版本需求部分。

基础部分

如果使用 GigHub 的仓库(GitHub.com 或者 GitHub Enterprise),使用时必须加入 github 关键字,比如:

1
2
github "ReactiveCocoa/ReactiveCocoa" # GitHub.com
github "https://enterprise.local/ghe/desktop/git-error-translations" # GitHub Enterprise

其他 git 仓库要加 git 关键字,如下:

1
git "https://enterprise.local/desktop/git-error-translations2.git"

版本需求

Carthage 支持以下几种版本声明:

  1. >= 1.0 大于等于版本 1.0
  2. ~> 1.0 兼容版本 1.0
  3. == 1.0 必须是版本 1.0
  4. 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 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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"