什么是Carthage
Carthage和CocoaPods都是用来管理第三方库,与CocoaPods相比Carthage更加轻量一些,它是由Swift编写的,所以在纯Swift项目中更为便利
A simple, decentralized dependency manager for Cocoa
一个简单、松散的依赖管理者
这个是Carthage Github上的描述
简单对比Carthage与Cocoapods
- Carthage用xcodebuild 构建框架(framework)的二进制文件,但是并没有将他们整合到用户项目中。Cocoapods的目的是让用户使用起来更简单,而 Carthage 则是更灵活,减少对项目的侵入性
- Cocoapods项目还必须具有所谓的podspec文件,其中包括有关项目的元数据,并指定应如何构建它。Carthage使用xcodebuild去构建依赖,而不是将它们集成到单个工作区中,它没有类似的规范文件,但你的依赖项必须包含到自己的 Xcode 项目中,该项目描述了如何构建其产品
安装Carthage
- 安装Homebrew
- 如果你已经安装了可以跳过这一步
- 更新最新版本
- 如果你没有安装,可以参考这里Mac 安装homebrew并更新到最新版本
brew update
如果遇到
Error: The /usr/local directory is not writable.
错误,就执行以下命令sudo chown -R $(whoami):admin /usr/local
再更新
- 安装Carthage
brew install carthage
- 查看Carthage版本
carthage version
在项目中使用Carthage
- 进入项目所在文件夹
- 创建Cartfile文件
- 打开Cartfile文件
- 编辑Cartfile文件,添加依赖库
cd 项目文件夹路径
touch Cartfile
open Cartfile
github "Alamofire/Alamofire" == 4.5
git "https://enterprise.local/desktop/git-error-translations2.git"
binary "/absolute/path/MyFramework.json"
Cartfile文件
- 格式
- 使用 github 关键字指定 GitHub 存储库(GitHub.com 和 GitHub Enterprise)
- 其他 git 存储库使用 git 关键字指定
- 仅作为已编译的二进制文件
.frameworks
提供的依赖项使用binary
关键字和https://
链接,file://
链接,或没有方案的相对或绝对路径,返回二进制项目规范
- 版本要求
-
>= 1.0
指“1.0 及以上版本”。 -
~> 1.0
指“1.x 版本” -
== 1.0
指“版本为 1.0” -
"some-branch-or-tag-or-commit"
特指 git 对象(git rev-parse 任何内容都被允许)。
Note:二进制源 不支持这种形式。
如果没有指定任何版本,任何版本的依赖都将被允许(默认使用最新版本)。
-
- 保存关闭Cartfile,运行Carthage
carthage update --platform iOS
运行命令后,一个叫Cartfile.resolved
的文件将会被创建到 Cartfile 同级目录下。此文件准确指定了每个依赖项选择的版本,并列出了所有依赖项(甚至是嵌套的版本)。
强烈建议将该文件加入到版本控制中,告知其他开发者,当前使用的版本。
虽然 Cartfile.resolved 文件是人类可读和可扩展的,但你不能修改它。文件的格式非常严格,列出依赖项的顺序对于构建过程很重要。
Carthage 文件夹
- Build
包含对应平台编译好的Framework - Checkouts
包含编译framework
所使用的源代码(除非你使用 submodules ,否则不要修改这里的代码,carthage update
和carthage checkout
会覆盖这里的代码,清除你的修改)。
在"Carthage/Build/iOS"文件夹中会生成 .framework 文件。
在项目中使用Carthage
- 在Carthage -> Build中找到需要的framework
- 将framework拖拽到Xcode 工程的
Linked Frameworks and Libraries
中 - 进入工程的 target -> Build Phases,点击 +,添加
New Run Script Phase
输入一下脚本
/usr/local/bin/carthage copy-frameworks
在 Input Files 下添加要使用的框架的路径
$(SRCROOT)/Carthage/Build/iOS/XXXX.framework
将复制框架的路径添加到 Output Files
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/XXX.framework
- 为什么需要指定 Output Files
使用 Carthage 来管理第三方库,在编译并运行 App 的时候,会有一个阶段叫:Carthage Copy Frameworks。这个阶段通过跑一个脚本的形式把所有依赖的第三方库都复制到 App 的目录里。
这个阶段通常会花 1~x 秒不等,这取决于你的 App 依赖的第三方库数量。默认情况下,每次你 Build & Run 的时候,都会进行一次这个操作——尽管你的第三方库没有任何改变。
所以我们需要指定 Output Files,在 Output Files 指定输出文件的情况下,Xcode 只会在 framework 发生更改时去进行 copy framework 操作,这样就节省了时间。
更新库
1、在carthage文件里面把有指定版本的库更新到想要的版本,如无指定版本可忽略
2、调用命令更新库
- 全部更新
carthage update --platform iOS
- 更新制定库
carthage update XXX --platform iOS
最后的话
虽然说Carthage是纯Swift编写,但个人感觉还是觉得CocoaPods更加便利快捷,特别是在国内。
在实际项目中Carthage升级或加库经常各种报错,有可能是本人学艺未精,经过万般折腾,本人还是会首选CocoaPods作为第三方库管理工具
参考文章
Carthage 新手教程
版权所有,如需转载请联系作者并注明出处