Carthage 是一款面向 iOS 和 macOS 项目的依赖项管理器,使开发者能够以简单高效的方式将第三方库集成到其应用程序中。与 CocoaPods 等其他工具不同,Carthage 注重极简和非侵入性,这意味着它不会改变项目的结构,只需要一个列出依赖项的简单文本文件,即 Cartfile。这使其成为希望在利用第三方库和框架的同时保持对项目设置控制权的开发者的热门选择。
Carthage 的工作方式是构建二进制框架,然后将其直接集成到 Xcode 项目中。这种方法意味着开发者可以享受更短的构建时间和更精简的开发流程。借助 Carthage,可以轻松地添加、更新和管理依赖项,而无需复杂的配置文件,也不会对项目造成不必要的更改。作为代价,构建好的框架需要手动添加到 Xcode 中。这使 Carthage 成为希望在 iOS 和 macOS 开发项目中获得简单而强大的依赖项管理解决方案的开发者的理想工具。
Carthage 是一款面向 iOS 和 macOS 项目的去中心化依赖项管理器。它将第三方库获取并构建为框架,然后由开发者自行将其添加到 Xcode 项目中,项目文件不会被自动更改。这使开发者能够完全掌控项目的结构,并且可以缩短构建时间,因为依赖项只在更新时才会构建。Carthage 主要用作 CocoaPods 的更简单替代方案,而 Swift Package Manager 则是 Apple 内置的包管理解决方案。
More about Carthage
Carthage 是一款面向 iOS 和 macOS 的依赖项管理器,提供了一种简单灵活的方式来将第三方库集成到项目中。与其他会自动更改项目设置的工具不同,Carthage 注重最少的设置,让开发者可以自由地管理项目,而不受不必要的限制。
从技术上讲,Carthage 通过从源代码构建二进制框架或下载预构建的框架来运作,使开发者能够将这些框架直接纳入其 Xcode 项目中。这意味着 Carthage 不会更改项目文件,而是生成一个“Carthage/Build”文件夹,用于存放编译好的框架。这种方法使开发者能够完全掌控其项目结构和依赖项。
Carthage 支持三项主要功能,每项功能分别提供一种不同的依赖项处理方式:
构建依赖项:Carthage 可以自动构建“Cartfile”中指定的所有依赖项。这使开发者能够专注于自己的代码,而由 Carthage 负责编译外部库。这一功能非常适合需要多个第三方库的项目。
更新依赖项:只需一条命令,Carthage 就能将所有依赖项更新到满足 Cartfile 中版本要求的最新版本。这使得让库及时获得包括安全修复在内的更新变得容易,这对于维持兼容性和安全性非常重要。
集成框架:Carthage 生成框架后,由开发者自行将其添加到 Xcode 项目中,通常添加在“Frameworks, Libraries, and Embedded Content”下。这需要一个手动步骤,但可以让开发者全面了解项目中到底包含哪些库,并能轻松利用第三方库中的新功能和改进。
Carthage 最大的优势之一是其简单性和灵活性。由于避免了自动更改项目,Carthage 使开发者能够保持对项目的控制。这降低了项目文件中发生冲突的风险,并使集成新的依赖项变得更容易,而不会打乱现有的项目结构。
Carthage 的依赖项管理方法也能在日常工作中节省时间。由于只在添加或更新依赖项时才构建它们,并避免不必要的项目更改,Carthage 将维护项目所需的时间和资源降至最低。这使其成为希望优化工作流程并专注于交付高质量软件的开发者的理想工具。
在实践中,Carthage 对开发者管理 iOS 和 macOS 项目依赖项的方式产生了重大影响。小型和大型开发团队都曾使用它来让项目保持最新、安全且易于维护。不过如今,Carthage 的开发已明显放缓,大多数库现在都优先支持 Swift Package Manager。
总之,Carthage 是一款将简单、灵活和高效融为一体的工具,使依赖项管理对于个人开发者和大型团队来说都更加透明。其简单的设置以及对项目结构的最少干预,使其成为 App 开发中的一款实用工具,因为在 App 开发中,快速而安全的集成必不可少。
Frequently asked questions about Carthage
什么是 Carthage?它在实践中是如何运作的?
Carthage 是一款去中心化的依赖项管理器,面向使用 Swift 和 Objective-C 编写的 iOS、macOS、tvOS 和 watchOS 项目。它没有中央包注册表。相反,每个依赖项都直接指向一个 Git 仓库,通常位于 GitHub 上。
依赖项在项目根文件夹中一个名为 Cartfile 的文本文件中指定。运行命令 carthage update 时,Carthage 会查找合适的版本,将源代码获取到 Carthage/Checkouts 文件夹中,并使用 Xcode 自身的构建工具构建每个库。构建好的框架会放在 Carthage/Build 中。
Carthage 不会更改 Xcode 项目文件。开发者需要在相应目标的 Frameworks, Libraries, and Embedded Content 下添加构建好的框架。这使开发者能够完全掌控项目设置,但与自动集成的工具相比,需要多做一些手动工作。
如何安装 Carthage?如何添加库?
Carthage 最常通过 Homebrew 使用命令 brew install carthage 安装。也可以从该项目在 GitHub 上的发布版本中下载安装包。
添加库通常分为四个步骤:
- 在项目根文件夹中创建
Cartfile文件,并写入一行,例如github "Alamofire/Alamofire" ~> 5.0。 - 命令
carthage update --use-xcframeworks --platform iOS会获取并构建该库。 - 将
Carthage/Build中构建好的.xcframework拖入 App 目标的 Frameworks, Libraries, and Embedded Content 中。 - 对于动态框架,选择 Embed & Sign。
~> 运算符表示,只要主版本号保持不变,就接受较新的版本。之后,就可以在代码中通过 import Alamofire 使用该库。
Cartfile 和 Cartfile.resolved 有什么区别?
Cartfile 描述项目需要哪些依赖项,以及它们必须满足哪些版本要求,例如 ~> 5.0、>= 2.1 或特定分支。该文件需要手动编辑,表达的是意图。
Cartfile.resolved 是自动生成的,包含实际选定的确切版本或提交,其中也包括依赖项自身的依赖项。该文件起到锁定作用,使团队中的每个人和每台构建服务器都获得完全相同的代码。
两者的区别体现在命令上:
carthage update查找与Cartfile匹配的最新版本,并将结果写入Cartfile.resolved。carthage bootstrap获取并构建Cartfile.resolved中列出的确切版本。
因此,两个文件都应纳入版本控制。仅在开发期间使用的依赖项,例如测试库,可以放在 Cartfile.private 中。
Carthage 如何构建 XCFramework?这为什么重要?
以前,Carthage 构建的是所谓的胖框架,即使用 lipo 工具将用于实体设备和模拟器的代码合并到一个文件中。这种方式从 Xcode 12 起不再可行,因为搭载 Apple 芯片的设备和模拟器都使用 arm64 架构,而同一种架构不能在一个胖框架中出现两次。
解决方案是 XCFramework,Apple 在 Xcode 11 中推出了它。XCFramework 是一个软件包,其中为每个平台和变体都提供了单独的二进制文件,例如 iOS 设备和 iOS 模拟器。从 Carthage 0.37 起,使用 --use-xcframeworks 标志构建 XCFramework,例如 carthage bootstrap --use-xcframeworks。
构建结果以 .xcframework 文件夹的形式放在 Carthage/Build 中。它们会被直接添加到 App 的目标中,以前使用 carthage copy-frameworks 的构建阶段已不再需要。
Carthage、CocoaPods 和 Swift Package Manager 有什么区别?
这三款工具解决的是同一项任务,但方式各不相同:
- Carthage 是去中心化的,直接从
Cartfile中指定的 Git 仓库获取依赖项。这些库被构建为二进制框架,Xcode 项目不会被更改。集成需要手动完成。 - CocoaPods 使用中央库注册表和
Podfile。pod install命令会创建一个工作区并更改项目设置,因此集成是自动进行的,但透明度较低。CocoaPods 目前处于维护模式。 - Swift Package Manager(SPM)是 Apple 自己的工具,内置于 Xcode 中。软件包可以直接在 Xcode 中添加,或在
Package.swift中描述,无需额外安装。
当需要完全掌控项目文件并缩短构建时间时,Carthage 很有用,因为依赖项只在更新时才会构建。对于新项目,SPM 现在是使用最广泛的选择,因为大多数库都支持它。
如何缩短 Carthage 的构建时间?
由于 Carthage 默认从源代码构建依赖项,首次构建可能需要很长时间。有几种选项可以缩短时间:
--platform iOS将构建限制在项目实际使用的平台上。--cache-builds会跳过已按相同版本构建过的依赖项,因此只重新构建发生变化的库。- 可以单独更新各个依赖项,例如使用
carthage update Alamofire,而不是更新全部依赖项。 - 许多库在其 GitHub 发布版本中提供预构建的框架,Carthage 会自动下载这些框架。闭源 SDK 可以使用
binary以及指向 JSON 规范的 URL 来指定。
在构建服务器上,还可以在多次运行之间缓存 Carthage/Build 文件夹。许多团队通过 .gitignore 将该文件夹排除在 Git 之外,并使用 carthage bootstrap 重新创建它。
Carthage for dummies
Carthage 是一款工具,帮助整理和管理构成 App 的小型构建模块,这些模块被称为“依赖项”。想象一下,开发一个 App 需要一些别人已经做好的现成部件,让它运行得更好。Carthage 帮助获取并跟踪这些部件,因此无需从零开始制作。它的作用有点像一位图书管理员,记录着一个项目所需的所有书籍,让作者可以专注于自己的故事。它让 App 开发变得更轻松、更快捷,因为可以重用别人的成果,同时确保一切都能契合在一起。