Carthage 简介
Carthage 与 CocoaPods 一样是为 iOS 程序提供依赖管理的工具,不同于 CocoaPods 用一个中心服务器来管理,Carthage 则是一个去中心化的依赖管理器。Carthage 也是一个开源项目,我们可以在 Github 上查看 项目源码。 Carthage 相比于 CocoaPods,有如下优势:
- 不需要每次都重新编译第三方库,节省时间
- 去中心化,每次配置更新环境,只需要去更新具体的库,节省时间
- 非侵入性,不会修改项目配置和结构
- 与 CocoaPods 无缝集成
Carthage 安装
brew 安装
在安装 Carthage 之前,首先要在本地安装好 brew ,更多详情可以点击进入官网 https://brew.sh/index_zh-cn.html。
首先打开终端。
然后输入以下命令安装。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
如果已经安装了 brew ,可以使用如下命令获取最新版。
brew update
注意在 macOS High Sierra 版本及以后的版本上,系统已经预装了 brew ,可能会更新失败,提示 Error: /usr/local is not writable. 错误,此时也不能使用 chmod
命令修改文件 /usr/local
的所有者。此时我们可以先卸载 brew ,然后再安装。卸载命令如下:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
重装以后,我们就可以使用 brew update
命令正常更新了。
brew 常用命令如下:
brew install app # 使用 brew 安装软件
brew install app@7 # 使用 brew 安装指定版本软件
brew uninstall app # 使用 brew 卸载软件
brew uninstall app --force # 使用 brew 彻底卸载软件,包括旧版本
brew upgrade app # 更新具体的软件
brew update # 更新 brew 和所有软件包
brew search /wge*/ # 使用 brew 查询软件,其中/wge*/是个正则表达式,需要包含在/中
brew list # 列出已安装的软件
brew home # 用浏览器打开 brew 的官方网站,查看信息
brew info # 显示软件信息
brew outdated # 查看哪些已安装的程序需要更新
brew deps # 显示包依赖
brew cleanup -n # 列出需要清理的内容
brew cleanup app # 清理指定的 app
brew cleanup # 清理所有旧的软件包
Carthage 安装
brew 更新完以后,输入以下命令安装 Carthage。
brew install carthage
Carthage 安装完成之后,使用如下命令查看版本。
carthage version
使用如下命令更新 Carthage。
brew upgrade carthage
如果想删除 Carthage,可以使用如下命令。
brew uninstall carthage
使用 Carthage
Cartfile 文件创建
命令行进入项目目录。
cd ~/Desktop/CarthageDemo
使用命令行创建并编辑文本文件 Cartfile 。
# 以下命令二选一
vim Cartfile # vim 命令只有在保存的时候才会创建文件
touch Cartfile # touch 命令则直接创建一个空白的文件
在文件 Cartfile 中,输入如下内容:
github "Alamofire/Alamofire" ~> 4.7
使用 vim 命令,保存并退出,在 Cartfile 处于编辑状态下,先按ESC
键,再按shift + :
组合键,输入命令: :wq
保存退出。 当然,我们也可以使用其他的方式创建 Cartfile 文本文件,并编辑内容,比如:可以使用 Atom 或者 VS Code 等编辑器创建。 这时候你会发现在你的项目目录中,出现了一个名字为Cartfile
的文本文件,而且文件内容就是刚刚输入的内容。
Cartfile 文本内容格式说明
Cartifile 的文本内容就是为了告诉 Carthage 应该从哪里下载哪些第三方库的,示例如下:
github "Alamofire/Alamofire" ~> 4.7
github "SnapKit/SnapKit" >= 4.0.0
git "git://carthage.com/project.git" "2b2e7edd4b"
git "file:///carthage/demo/project" "master"
Cartfile 支持两种类型的源:
github
表示依赖库来自于 github,不需要完整的地址,只需要Username/ProjectName
即可。git
表示使用资料库的地址,需要使用 URL 地址,例如:git://
、http://
、ssh://
,也可以是本地资料库地址。
Cartfile 版本号,可以不用指定,不指定则默认使用最新版本:
== 1.0
表示使用 1.0 版本>= 1.0
使用 1.0 或更高版本~> 1.0
使用 1.0 以上但是低于 2.0 的最新版本branch/tag/commit 名称
意思是使用特定的分支/标签/提交,可以是分支名为master
,也可以是提交5c8a74b
Carthage 安装第三方库
Cartfile 文件编辑好以后,我们就可以使用如下命令来安装第三方库了。
carthage update --platform iOS --no-use-binaries
其中 --platform iOS
和 --no-use-binaries
是可选的。 --platform iOS
作用是保证只为 iOS 编译 framework, 如果不指定平台,则会编辑全平台的 framework 文件; --no-use-binaries
作用是不使用远程已编译好的二进制 framework,而是下载源码到本地,使用本地源码编译的二进制 framework,这样可以避免网络不好,总是提示下载远程二进制 framework 失败的提示;如果想了解更多,可使用 carthage help update
命令查看。 如果只需要新增或更新某个第三方库,可以使用如下命令。
carthage update Alamofire --platform iOS
当命令执行完毕后,在 Cartfile 文本文件同级别的文件夹中会生成一个名为 Carthage 的文件夹和 Cartfile.resolved 文件。打开 Carthage 文件夹,可以看到两个文件夹 Build 和 Checkouts 。 Cartfile.resolved :这是个辅助 Cartfile 文件,需要提交到版本库中,用于帮助其他开发者使用和你相同版本的第三方库。 Build :包含所有第三方库生成的 framework,用于集成到项目中。 Checkouts :包含所有第三方库转换成 framework 之前的源文件。
ps: 不要改变 Checkouts 文件中的内容,因为如果使用
carthage update
或者carthage checkouts
命令的话,这个文件中的内容会被复写,那么改动就白费了。但是,如果一定要改动的话,在使用命令时,可以使用--use-submodules
选项。这样 Carthage 在添加每个依赖库的时候会作为一个子模块。 在 Xcode 10 Debug Swift 项目时,如果在 LLDB 中, 无论 po 或者其他的操作,均显示 error: Couldn’t IRGen expression, no additional error 错误,这是由于 Carthage 从官方网站下载的二进制 Framework 导致的,所以我们可以使用命令carthage update --platform iOS --no-use-binaries
来使用自己的二进制文件,修复该问题。
如果其他人想要使用你的工程,我们不需要提交已经编译好的 framework,他们只需要在 check out 你的工程之后,执行如下命令即可。
carthage bootstrap
bootstrap
命令会根据 Cartfile.resolved 文件下载和编译依赖库的精确版本。而如果使用 carthage update
命令,则会更新项目中的第三方库到最新的编译版本,我们应该尽量避免。
添加 Framework 到项目中
构建 macOS APP
使用 Xcode 打开项目,点击 项目工程->target->General 选项卡,然后找到 Embedded Binaries 选项。 打开 /Carthage/Build/mac
找到第三方库 *.framework
, 然后拖拽这些 *.framework
到 Xcode 的 Embedded Binaries 中。 或者也可以点击 Xcode 中 Embedded Binaries 下的 + 按钮添加第三方库。
构建 iOS APP
使用 Xcode 打开项目,点击 项目工程->target->Gerneral 选项卡,然后在最底部找到 Linked Frameworks and Libraries 。 打开 /Carthage/Build/iOS
找到第三方库 *.framework
, 然后拖拽这些 *.framework
到 Xcode 的 Linked Frameworks and Libraries 中。 或者也可以点击 Xcode 中 Linked Frameworks and Libraries 下的 + 按钮添加第三方库。
然后找到 项目工程->target->Build Phases 选项卡,然后点击 + 按钮,选择 New Run Script Phase ,添加新的 Run Script。
添加命令 /usr/local/bin/carthage copy-frameworks
。 点击 Input Files 下的 + 按钮,为每一个第三方库添加条目,这里以 Alamofire 库为例 $(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
。
点击 Output Files 下的 + 按钮,为每一个第三方库添加条目,这里以 Alamofire 库为例$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework
。加上这个以后,以后只在 Framework 改变的情况下,才会跑一遍 Copy 脚步,可以加快项目的编译速度
添加完成以后,使用快捷键 Command + B
编译项目,成功以后,就可以使用导入的 framework 了。
import Alamofire
调试和报告第三方库的 Crash
打开 项目工程->target->Build Phases 选项,点击 + 按钮,选择 New Copy Files Phase ,添加新的 Copy Files 。
点击 Destination 下拉菜单,选择 Products Directory 。 打开 /Carthage/Build/iOS[mac]
文件夹,找到第三方库的 dSYM 文件 *.framework.dSYM
,拖拽这些文件到 Name 下面。
这样当我们调试时,Xcode 将在断点处符号化调用堆栈,也可以使其深入到第三方代码中去。当归档我们的应用来提交到 AppStore 或者 TestFlight,Xcode 也会拷贝这些文件到应用的 .xcarchive bundle 的 dSYMs 子目录。
ps: 有可能在加入了符号文件后,造成编译出错,这时,可以打开 项目工程->target->Build Settings ,找到 Strip Debug Symbol During Copy 选项,确保这个选项的值设置为 NO 。然后在重新编译以下。