我有一个 Carthage 和 Cocoapods 的项目。它们都有一个共同的依赖关系(准确地说是 PureLayout)。奇怪,但是项目编译得很好,没有关于类重新声明等的任何错误。所以问题是:为什么它工作以及当我调用 PureLayout 的方法时实际使用哪个版本的依赖项——Carthage 的或 Cocoapods 的?
2 回答
Carthage
并且CocoaPods
在构建依赖项并将它们集成到项目中方面非常不同。
CocoaPods 是集中式依赖管理器,它将构建您的依赖项并通过创建新.xcworkspace
工作区将它们直接集成到项目中。这意味着您可以在构建后立即访问构建依赖项。
另一方面,Carthage 是分散的依赖管理器,它留给您将依赖项集成到项目中的任务。Carthage 构建指定的框架Cartfile
并将它们移动到Carthage/Builds
文件夹。在构建过程之后,由您来集成和管理依赖项。
在您的情况下,当您PureLayout
使用 CocoaPods 和 Carthage 构建依赖项时,CocoaPods 将其集成到项目中,Carthage 为您留下了构建版本,Carthage/Builds
这意味着您仅使用 CocoaPods 构建版本的PureLayout
.
此外,使用多个包/依赖项管理器是一种不好的做法。您应该坚持使用它并对此感到满意。
iOS 依赖管理器
当您不使用 aDependency manager
作为开发人员时,您需要负责:
- 寻找依赖
- 解析依赖图和版本控制
- 下载源
- 将依赖项添加到 Xcode
当你决定升级依赖时,你应该从头开始这个过程
Dependency manager
是一种工具,可帮助用户以最少的代价将依赖项添加到项目中
CocoaPods
[About]是一个开源的、集中的依赖管理器,用于 Swift 和 Objective-C Cocoa 项目,它是用 Ruby 编写的。它支持Dynamic Frameworks
和Static Libraries
[时间线]
笔记:
CocoaPods 需要有一个工作空间
消费者项目没有清晰的依赖关系视图<Pods_target-name.framework>
每次构建项目时都会重新构建所有依赖项。
不能在同一个工作空间中使用不同的 pod 版本
CocoaPods could not find compatible versions for pod
Carthage
[About]是一个开源的、分散的依赖管理器,用于 Swift 和 Objective-C Cocoa 项目,它是在 Swift 上编写的。它支持Dynamic Frameworks
并Static Libraries
笔记:
- 作为消费者项目开发人员,您负责设置具有依赖项的 Xcode。它在 IDE 中创建了一些额外的步骤
- 作为依赖开发人员,您没有一些工具(例如子规范)
Swift Package Manager(SPM)
[About]是一个开源的、分散的 依赖管理器,它是在 Swift 上编写的。它支持动态和静态库。.xcodeproj
未使用。如果你想分发封闭源代码(二进制框架),你应该使用XCFramework
[关于]
*CocoaPods
默认情况下每次(在清理或任何未知原因之后)构建开源 pod,这会增加构建时间(但您可以使用cocoapods-binary
),Carthage
并且SPM
默认预构建框架。
*closed-source 允许您关闭源代码并节省构建时间,但可能会遇到ABI stability
[关于]的问题