Cocoa依赖包管理工具

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 工作流程

基本的工作流程如下:

  1. 创建一个 Cartfile 并且列出需要使用的框架。

  2. 运行 carthage,用于获取和编译每个列出的框架。

  3. 拖动编译后的 .framework 二进制文件到你的 Xcode 工程。

非常简单对吧,不过经过实际测试,还有一种办法就是把 Carthage 编译的 Framework 路径加入到 Build Setting 中的 Framework Search Path

安装 Carthage

在 Xcode7.x 版本,你可以使用 Homebrew 命令安装 carthage 工具

> brew update & brew install carthage

不过需要注意的是,现在 Carthage 只能支持动态框架,也就是动态链接库,只能在 iOS8 及以后版本使用。

项目添加框架

新手起步

为 OS X 项目编译

  1. 创建一个包含了第三方框架列表的 Cartfile

  2. 运行 carthage update。这将会获取依赖到 Carthage/Checkouts 文件夹并且编译所有的框架。

  3. 在的应用程序的目标 General 设定标签页的 Embedded Binaries 节,从拖动并且放置你想要的框架。

另外,你可能需要复制调试符号信息和崩溃报告在 OS X上。

  1. 在应用程序 Build Phases 设定选项卡,点击 “+” 号并且选择 “New Copy FIles Phase”。

  2. 点击 “Destination” 下拉菜单并且选择 “Products Directory”。

  3. 对你需要的框架,拖动并且放置相应的 dSYM 文件。

为 iOS、tvOS 或 watchOS 编译

  1. 创建一个包含了第三方框架列表的 Cartfile

  2. 运行 carthage update。这将会获取依赖到 Carthage/Checkouts 文件夹并且编译所有的框架。

  3. 在应用程序目标 General 设定选项卡的 Linked Frameworks and Libraries 节,从 Carthage/Build 拖动并且放置需要的框架。

  4. 在应用程序 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. >= 1.0 – 至少是 1.0 版本

  2. ~> 1.0 – 兼容 1.0 版本的版本

  3. == 1.0 – 就是 1.0 版本

  4. "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
    原文作者:山河永寂
    原文地址: https://segmentfault.com/a/1190000004580976
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞