# 包管理工具 ## CocoaPods CocoaPods 是非常好用的第三方依赖管理工具,它于2011年发布,经过这几年的发展,已经非常完善。CocoaPods 支持项目中采用 Objective-C 或者 Swift 语言。CocoaPods 会将第三方库的源代码编译为静态库 `.a` 文件或者动态库 `.framework` 文件的形式,并将它们添加到项目中,建立依赖关系。 ## Carthage Carthage 是一个轻量级的项目依赖管理工具。Carthage 主张“去中心化”和“非侵入性”。 CocoaPods 搭建了一个中心库,第三方库被收入到该中心库,所以没有被收录的第三方库是不能使用 CocoaPods 管理的。这就是“中心化”的思想。而 Carthage 没有这样的中心库,第三方库基本都是从 Github 或者私有 git 库中下载的。这就是“去中心化”。 另外,CocoaPods 下载第三方库后,会将其变异成静态链接库或者动态框架文件,这种做法会修改 Xcode 项目属性依赖关系,这就是所谓的“侵入性”。而 Carthage 下载成功后,会讲第三方库编译为动态框架,由程序员自己配置依赖关系,Carthage 不会修改 Xcode 项目配置,这就是所谓的“非侵入性” ### 安装 ``` brew update brew install carthage ``` 觉得 brew update 更新慢,不想更新的也可以执行 `export HOMEBREW_NO_AUTO_UPDATE=true`。由于经常在终端干活,所以设置了别名。 ```shell # 禁止终端利用 homebrew 安装插件时候的自动更新 alias disableHomebrewUpdate="export HOMEBREW_NO_AUTO_UPDATE=true" ``` ### 使用 - 创建 cartfile 文件 `touch cartfile` - 修改 cartfile 文件 ``` github "Alamofire/Alamofire" "5.0.0-rc.3" github "onevcat/Kingfisher" github "SnapKit/SnapKit" ~> 5.0.0 ``` ### cartfile - dependency origin Carthage 支持两种类型的源,一个是 github,一个是 git - github 表示依赖源,告诉 Carthage 去哪里下载文件。依赖源之后跟上要下载的库,格式为 `Username/ProjectName` - git 关键字后面跟的是资料库的地址,可以是远程的 URL 地址,使用 `git://` `http://` `ssh://` 或者是本地资料库地址。 ### cartfile - dependency version 告诉 Carthage 使用哪个版本,这是可选的。不指定的话,默认使用最新版本 - `==1.0` 表示使用 `1.0` 版本 - `>= 1.0` 表示使用 `1.0` 或更高的版本 - `~> 1.0` 表示使用版本 `1.0` 以上,但是低于2.0的最新版本,例如:1.2, 1.6 - branch 名称/ tag 名称/ commit 名称,意思是使用特定的分支/标签/提交。比如可以说分支名 master,也可以是 commit id: 5c8w72 ### 更新 `carthage update` 但默认会编译4个平台(macOS、iOS、watchOS、tvOS) 会比较耗时,所以可以优化下,指定特定平台 `carthage update --platform iOS` ### 安装后生成的文件 #### Cartfile.resolved 该文件是生成后的依赖关系以及各个库的版本号,不能修改。 该文件确保提交的项目可以使用完全相同的配置与方式运行启用。跟踪项目当前所用的依赖版本号,保持多端开发一致,出于这个原因。建议提交这个文件到版 本控制中。 ``` github "Alamofire/Alamofire" "5.0.0-rc.3" github "onevcat/Kingfisher" github "SnapKit/SnapKit" ~> 5.0.0 ``` #### Carthage 目录 该目录包含2个子目录: - Checkouts 保存从 git 拉取的依赖库源文件 - Build 包含编译后的文件,包含了4个平台(Mac、iOS、tvOS、watchOS)对应的 `.framework` ``` - Carthage - Build - Checkouts ``` ### 项目配置 `Target -> Build Setting -> Search Paths -> Framework Search Paths` 添加 `$(PROJECT_DIR)/Carthage/Build/iOS` 此时可以正常编写代码,和使用库的 api,但项目运行会 crash,报错为:`dyld: Library not loaded: @rpath/SnapKit.framework/SnapKit Referenced from: ...` 由于是非侵入式,所以需要程序员自己配置依赖,`Target -> Build Phases -> '+' -> New Run Script Phase` - 添加脚本 `/usr/local/bin/Carthage copy-frameworks`。 - 添加 "Input Files" `$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework` 等等 ## Swift Package Manager Swift Package Manager 是苹果推出的用于管理分发 swift 代码的工具,可以用于创建使用 swift 的库和可执行程序 能够通过命令快速创建 library 或者可执行的 swift 程序,能够跨平台使用,是开发出来的项目能够运行在不同的平台上。 ### Xcode 集成 Xcode 菜单栏:File -> Swift Packages -> Add Package Dependency... 输入项目地址后,在弹出框 Rules 里选择版本策略。