• 首页
  • 关于
    • zerone-z photo

      zerone-z

      记录下自己学习的过程、点滴,也为了分享自己的收获。

    • Learn More
    • Email
    • Github
  • 博客
    • 博客
    • 标签
  • 随笔
  • 项目

使用 Carthage 做 iOS 程序的依赖管理

22 Jun 2018

Reading time ~3 minutes

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 下的 + 按钮添加第三方库。

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 下的 + 按钮添加第三方库。

Linked Frameworks and Libraries

然后找到 项目工程->target->Build Phases 选项卡,然后点击 + 按钮,选择 New Run Script Phase ,添加新的 Run Script。

New Run Script

添加命令 /usr/local/bin/carthage copy-frameworks 。 点击 Input Files 下的 + 按钮,为每一个第三方库添加条目,这里以 Alamofire 库为例 $(SRCROOT)/Carthage/Build/iOS/Alamofire.framework 。

Script

点击 Output Files 下的 + 按钮,为每一个第三方库添加条目,这里以 Alamofire 库为例$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/Alamofire.framework 。加上这个以后,以后只在 Framework 改变的情况下,才会跑一遍 Copy 脚步,可以加快项目的编译速度

Script

添加完成以后,使用快捷键 Command + B 编译项目,成功以后,就可以使用导入的 framework 了。

import Alamofire

调试和报告第三方库的 Crash

打开 项目工程->target->Build Phases 选项,点击 + 按钮,选择 New Copy Files Phase ,添加新的 Copy Files 。

New Copy Files

点击 Destination 下拉菜单,选择 Products Directory 。 打开 /Carthage/Build/iOS[mac] 文件夹,找到第三方库的 dSYM 文件 *.framework.dSYM ,拖拽这些文件到 Name 下面。

dSYM

这样当我们调试时,Xcode 将在断点处符号化调用堆栈,也可以使其深入到第三方代码中去。当归档我们的应用来提交到 AppStore 或者 TestFlight,Xcode 也会拷贝这些文件到应用的 .xcarchive bundle 的 dSYMs 子目录。

ps: 有可能在加入了符号文件后,造成编译出错,这时,可以打开 项目工程->target->Build Settings ,找到 Strip Debug Symbol During Copy 选项,确保这个选项的值设置为 NO 。然后在重新编译以下。



iOSCarthage Like Tweet +1