【Carthage】依赖工程管理工具

carthage

是什么:

Carthage 功能主要是处理各个项目之间的依赖关系,如果没有 Carthage,要管理自己项目所依赖的其他项目,需要组织好一堆依赖库,并且编译最新的或者满足要求的依赖库,如果有更新也需要手动去获取和组织。在程序员看来,这个过程就太过复杂了。我们需要一个工具来为我们自动管理依赖,处理重复性的工作,解放我们的双手。

为什么:

在了解 Carthage 之前,Cocoapods 一直是我们的首选项目管理方式,他的管理过程为:
1、在项目根目录生成一个基于 OGDL 的 podfile 文件。
2、安装 Cocoapods,更新依赖库。
3、使用 Cocoapods 为你自动生成的 workspace 来进行开发。
在使用了 Cocoapods 之后,你必须使用他为你生成的 workspace 来进行代码的编译和运行发布。有没有感觉被隐瞒了很多事情,这样并不是最直接使用 xcodebuild 工具来进行编译的方式,这样也会让人感到有种被过度绑架的感觉。不就是管理项目依赖,何必要做的这么麻烦。
在了解的最常用的 Cocoapods 的项目管理方式之后 ,我们可以想一下,我们真正想要的管理依赖库需要用到的流程应该是怎样:
1、将本项目的依赖库全部组织起来。
2、挨个更新代码,并编译最新版本的依赖库库,生成 framework 文件。
3、将文件挨个加入到本项目中,再运行本项目。
正因为 Cocoapods 的管理方式过于 “强势” ,Carthage 便应运而生了。它几乎就是按着我们真正需要的管理方式和和我们交互。这也让依赖的管理更为透明,可定制化更高。
这也是我弃用 Cocoapods ,转而使用 Carthage 来管理依赖的主要原因。

怎么办:

1、创建 Cartfile 文件,用来确定哪些依赖库、以及依赖库的版本号。
2、在程序根目录执行 carthage update,这一步骤,会将依赖库 down 到 Carthage/Checkouts 文件夹,并依次编译。
3、从 Carthage/Build 文件夹中,将需要的 framework 拖入 taget 对应的 Linked Frameworks and Libraries 目录中去。
4、在项目的 Build Phases 目录下,增加一项 New Run Script Phase 脚本,填入如下脚本:
/usr/local/bin/carthage copy-frameworks
5、在 Input Files 中,加入如下库文件路径例如:
$(SRCROOT)/Carthage/Build/iOS/Box.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework

各种命令:

archive : Archives a built framework into a zip that Carthage can use
bootstrap : Check out and build the project’s dependencies
build : Build the project’s dependencies
checkout : Check out the project’s dependencies
copy-frameworks : In a Run Script build phase, copies each framework specified by a SCRIPT_INPUT_FILE environment variable into the built app bundle
fetch : Clones or fetches a Git repository ahead of time
help : Display general or command-specific help
update : Update and rebuild the project’s dependencies
version : Display the current version of Carthage

各个目录:

Cartfile:OGDL 描述的文件。用来告知 Carthage 需要什么标准的库。
Carthage/Build:依赖项目编译后的 framework 库文件位置。
Carthage/Checkouts:导出的依赖库。
Cartfile.resolved:执行carthage 之后,生成的文件,告知用户下载的依赖库究竟是什么版本的。
Cartfile.private:会被 carthage 管理起来,但是并不存在于主工程目录下。这个比较适合于管理测试依赖库。