Carthage简介
Carthage 是一款iOS项目依赖管理工具,与Cocoapods有着相似的功能,可以帮助你方便的管理三方依赖。它会把三方依赖编译成
framework,以 framework 的形式将三方依赖加入到项目中进行使用和管理。
与 Cocoapods 的异同
Cocoapods 是一个已经长期存在的对 iOS 三方依赖进行管理的工具,它已经相当的成熟,为什么要使用 Carthage 呢?
CocoaPods 的方式使用更简单,但 Carthage 更灵活,同时它对用户的工程没有侵入性。
在使用 CocoaPods 时,会为工程默认自动创建一个 Xcode workspace 来管理主工程和三方依赖,Carthage 使用 xcodebuild 将依赖构建成 framework 二进制文件,交给用户集成到自己的项目中。CocoaPods 集中式管理,Carthage 是分散式管理
CocoaPods 在官方 README 中指出它的一个目标:
… to improve discoverability of, and engagement in, third party open-source libraries, by creating a more centralized ecosystem.
CocoaPods 可支持的所有三方依赖信息都被存储在 Specs 库中,方便所有的开发者使用和完善它。
相比而言,Carthage 是一个分散式的三方依赖管理工具。Carthage 没有所有三方依赖的信息列表中心,减少了网络等因素对访问类似这样一个信息列表的失败的可能性。但同时,这增加了用户去发现查找想要使用的三方依赖的难度,你必须访问 Github 的 Trending 或者类似的方式去查找想要使用的三方库。
CocoaPods 的工程必须有一个 podspec 文件,它包含了这个工程的元数据信息和构建信息。Carthage 使用 xcodebuild 构建依赖,来代替将依赖都集成到一个 workspace ,它没有类似像 podspec 的规格说明文件,不过你使用的依赖需要描述怎么构建他们的产品。
Carthage 使用
1. 安装 Carthage
- Carthage.pkg
到 Carthage官方下载 最新版本,直接使用
Carthage.pkg 安装 - 使用 Homebrew
brew update
brew install carthage
2. 使用 Carthage 添加 frameworks 依赖到你的工程
- 创建并编辑Cartfile
到你的工程根目录下创建一个 Cartfile,在文件中指明你想要添加的 frameworks 依赖
如:
github "SwiftyJSON/SwiftyJSON"
github "jdg/MBProgressHUD" ~> 1.0.0
- 更新并构建
执行
carthage update
执行后会拉取在 Cartfile 中指明的依赖到 Carthage/Checkouts 文件夹,然后会构建相应的 framework。
设置 Linked Frameworks and Libraries
选中你的工程 target,到 'General' 设置的tab下,将 Carthage/Build 下的相应 framework 拖拽到 'Linked Frameworks and Libraries' 选项中。设置 Build Phases
选中你的工程 target,到 'Build Phases' tab下,点击 '+' 选择 'New Run Script Phase',创建一个Script,添加以下内容:
/usr/local/bin/carthage copy-frameworks
然后添加相应的内容到下面的 'Input Files' (举例):
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework
$(SRCROOT)/Carthage/Build/iOS/MBProgressHUD.framework
这个脚本是为了处理 App Store 提交的 bug,解决APP因为使用的frameworks包含二进制图像的iOS模拟器在提交APP Store时会被自动拒绝的问题。
3. 更新 frameworks
编辑你的 Cartfile,然后执行:
carthage update
如果你想更新某个 framework:
carthage update MBProgressHUD
4.创建一个支持 Carthage 的库
Carthage 仅支持 dynamic frameworks。 Dynamic frameworks只能在 OS X 或 iOS 8 以后的系统使用。
创建 framework target 到你的工程
在你的工程下创建一个新的 framework target。配置 framework target
选择 framework target,选中Build Phases,将需要暴露的头文件拖拽到 Public 里面,将相应的.m文件拖拽到
Compile source 里面。
如果你的 framework target 名称与你想要打包构建的 framework 名称不一致,选中Build Settings 选项卡,打开Packaging,把 'Produce Module Name' 和 'Produce Name' 改成你想要构建的 framework 名称。
注意:
- 如果你使用了类别,那么你需要在Build Settings的Linking的Other Linker Flags里加上-all_load
- 如果你想你的工程支持bitcode,需要在Other C Flags 里加上-fembed-bitcode
Manager Schemes
单击顶部 target,在弹出选项中选中 'Manager Schemes' ,将 framework target 的 Shared 选项选中。
注意:
这是由于Carthage 在 build 时,会自动将设置为 Shared 的 framework target 构建成 framework。构建 framework
执行
carthage build --no-skip-current
执行结果会保存在工程的 Carthage/Build 文件夹下。
测试 framework
创建一个测试项目,将上面 4 中生成好的 framework 文件添加到测试工程进行测试。(具体略)发布tag
在 5 没有问题时,打一个 tag 并 push,tag名称必须是 semantic version:
git tag 0.1.0
git push --tags
至此你的库以及支持 Carthage 了,可以让其他开发者使用 Carthage 来管理你的项目依赖了。
5. 相关
1. Cartfile 语法
Cartfile 描述工程所有使用 Carthage 依赖的 frameworks。Cartfile 遵循 Ordered Graph Data Language 语法。
- github 的库
github "ReactiveCocoa/ReactiveCocoa" # GitHub.com
github "https://enterprise.local/ghe/desktop/git-error-translations" # GitHub Enterprise
- 其它 git 库
git "https://enterprise.local/desktop/git-error-translations2.git"
- 只支持二进制文件的 frameworks
binary "https://my.domain.com/release/MyFramework.json"
- 版本号
>= 1.0 //“大于等于 1.0 的版本”
~> 1.0 //“1.0及以上的兼容版本,<2.0”
== 1.0 //“1.0版本”
"some-branch-or-tag-or-commit" //特定的分支、tag、或者提交
- 示例
# 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"
# A binary only framework
binary "https://my.domain.com/release/MyFramework.json" ~> 2.3
2. 目录结构
在使用 Carthage 管理 frameworks 时,工程根目录下与 Cartfile 同级的会存在 Cartfile.resolved
文件和
Carthage
文件夹, Carthage
文件夹又包含 Build
和 Checkouts
两个文件夹。
Cartfile.resolved
文件
包含已经添加的 frameworks 信息,包括依赖名称和当前使用的版本信息。Checkouts
文件夹
包含所有 frameworks 源码信息,在执行carthage build
时,会直接使用里面的project
或者workspace
相应的scheme
来构建相应的 framework。Build
文件夹
包含所有的二进制构建结果,包括.framework
二进制文件和.dSYM
等文件。
3.Carthage 语法
update或者build时指定平台
carthage build --platform ios
carthage update --platform ios