Carthage
iOS 作为目前最大的移动端开发平台,开发者的生态环境也是非常繁荣。在 iOS 早期时候,开发者想要使用第三方库就必须将其源代码引入工程,或者说是以 git submodule
的形式引入项目,但是这样子非常繁琐,并且还不能让多个项目公用,所以就有了著名的 iOS 依赖管理工具 CocoaPods
。确实 CocoaPods 非常好用,而且已经成为了事实上的依赖管理标准,不但有丰富的第三方库支持,有关其的文档也是非常全,但是今天笔者想在这里安利一款全新的 iOS 包管理工具 Carthage
笔者在以前很少使用 CocoaPods,并不是说它不好,而是 CocoaPods 对项目的侵入程度太高了,CocoaPods 不仅牵扯到了 Xcode 工作空间,而且还会使用一系列的脚本来保证自动化的第三方库整合,当然,如果是曾经自己手动整合第三方库为静态库的朋友应该很清楚 CocoaPods 到底做了什么,但是对于一个新人来说,恐怕根本不明白 CocoaPods 到底做了什么,而且出现了编译链接问题也无法自行解决,而 Carthage 的设计哲学则非常符合笔者的想法,低耦合、更灵活,使用现代化的 xcodebuild
工具编译成第三方整合库。Swift 写成,更容易贡献代码。
Carthage 和 CocoaPods 区别
CocoaPods 是一个 Cocoa 深度依赖包管理器,所以默认情况下会自动创建并且更新 Xcode 工作空间和所有的依赖,包括 target 之类,Carthage 使用 xcodebuild
命令编译框架,但是需要用户自己整合到工程中,当然实际上这个整合工作非常非常方便。对于用户来说,CocoaPods 更加易于使用,但是 Carthage 更加灵活和低侵入性。
CocoaPods 在自己的 README 说明中这样讲
… to improve discoverability of, and engagement in, third party open-source libraries, by creating a more centralized ecosystem.
这也是两者的最大区别,一个是中心化生态系统,一个是去中心化包管理器。也就是说,不存在任何服务器为 Carthage 服务,这也避免了维护的工作和中心服务器的宕机。当然,第三方库的查找也更困难了,一般只能通过 Github 的搜索功能。
Carthage 工作流程
基本的工作流程如下:
创建一个
Cartfile
并且列出需要使用的框架。运行
carthage
,用于获取和编译每个列出的框架。拖动编译后的
.framework
二进制文件到你的 Xcode 工程。
非常简单对吧,不过经过实际测试,还有一种办法就是把 Carthage 编译的 Framework 路径加入到 Build Setting
中的 Framework Search Path
。
安装 Carthage
在 Xcode7.x 版本,你可以使用 Homebrew 命令安装 carthage 工具
> brew update & brew install carthage
不过需要注意的是,现在 Carthage 只能支持动态框架,也就是动态链接库,只能在 iOS8 及以后版本使用。
项目添加框架
新手起步
为 OS X 项目编译
创建一个包含了第三方框架列表的
Cartfile
。运行
carthage update
。这将会获取依赖到Carthage/Checkouts
文件夹并且编译所有的框架。在的应用程序的目标
General
设定标签页的Embedded Binaries
节,从拖动并且放置你想要的框架。
另外,你可能需要复制调试符号信息和崩溃报告在 OS X上。
在应用程序
Build Phases
设定选项卡,点击 “+” 号并且选择 “New Copy FIles Phase”。点击 “Destination” 下拉菜单并且选择 “Products Directory”。
对你需要的框架,拖动并且放置相应的 dSYM 文件。
为 iOS、tvOS 或 watchOS 编译
创建一个包含了第三方框架列表的
Cartfile
。运行
carthage update
。这将会获取依赖到Carthage/Checkouts
文件夹并且编译所有的框架。在应用程序目标
General
设定选项卡的Linked Frameworks and Libraries
节,从Carthage/Build
拖动并且放置需要的框架。在应用程序
Build Phases
设置选项卡,点击 “+” 号并且选择 “New Run Script Phase”。创建一个包含下列内容的运行脚本。
/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
Cartfile
cartfile 目前只支持两种形式,一种是 Github 的形式,一种是 Git 的形式
github "ReactiveCocoa/ReactiveCocoa" # GitHub.com
github "https://enterprise.local/ghe/desktop/git-error-translations" # GitHub Enterprise
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 对象
相关文件
Cartfile.private
想要使用 Carthage 管理的框架,但是不想要将这些依赖放在父工程
Cartfile.resolved
在运行 carthage update
命令后,一个名为 Cartfile.resolved
的文件将被创建在 Cartfile
的同一目录。这个文件精确指定了依赖的版本,并且列出了所有的依赖,这个文件应当提交到版本控制系统中,确保任何人都能构建同样的工程。
Carthage/Build
使用 carthage build
命令后就会创建这个文件夹,并且包含了所有的二进制框架和调试信息。
Carthage/Checkouts
使用 carthage checkout
以后就会创建的文件夹,里面包含了所有的依赖的源代码,并且将会被 carthage build
命令使用。
.gitignore
Carthage.checkout
Carthage.build