Files
knowledge-kit/Chapter1 - iOS/1.131.md
2024-04-27 13:01:58 +08:00

4.9 KiB
Raw Blame History

包管理工具

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。由于经常在终端干活,所以设置了别名。

# 禁止终端利用 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 里选择版本策略。