在开发CocoaPod时使用CocoaPod依赖项

sol*_*ell 14 xcode frameworks ios cocoapods swift

比方说MyPod,我正在创建一个CocoaPod,这取决于另一个Cocoapod RxSwift.

所以我有这个MyPod.podspec:

s.dependency "RxSwift", "~> 3.0.1"
Run Code Online (Sandbox Code Playgroud)

但是,在开发时MyPod,我如何实际使用依赖?

import RxSwift
//     ^
// No such module 'RxSwift'

public class MyClass { //...
Run Code Online (Sandbox Code Playgroud)

我缺少一个步骤,还是一些常见的约定?看起来像Moya这样的其他项目正在使用Carthage在开发过程中构建依赖项.我应该这样做,还是可以添加一个Podfile

我知道这对于位于repo中的示例应用程序来说应该不是问题,它应该有自己的Podfile.但是,我仍然希望测试位于示例应用程序之外的顶层,并且能够在处理它时实际构建框架,同样,在示例应用程序之外.

Eri*_*ken 11

我不能谈论是否使用CocoaPods或Carthage.两者都有其优点和缺点.另外,应该考虑许多因素,其中一些因素可能无法控制(比如坚持使用CocoaPods的客户端!)所以我会跳过那部分.

但是,对于您的问题,您正在开发的吊舱确实可以依赖于另一个吊舱.你已经有了正确的s.dependency路线.这是必要的.

但是,我怀疑您无法引用依赖pod的原因可能是因为您的'tester/example'项目中没有Podfile和/或您pod install在Podspec中添加依赖项后没有执行.

这样做的原因是我怀疑是因为Podspec实际上并没有被Xcode处理,所以你实际上并没有下载(或编译)依赖项.

相反,当您进行pod安装(当然是通过命令行)时,CocoaPods将使用您的开发窗格,您依赖的窗格(在Podspec中)以及Podfile中的任何其他窗格创建一个Pods项目.

为了验证这个理论,我:

  • 创建了一个新的pod(使用CocoaPod自己的'pod lib create'(https://guides.cocoapods.org/making/using-pod-lib-create.html).
  • 打开CocoaPod为我创建的工作区,并编辑Podspec以添加依赖项s.dependency 'RxSwift', '~> 3.0.1'.
  • 在我的Example App的Podfile中添加了另一个pod(用于演示Podfile依赖项和Podspec依赖项之间的区别.)
  • 演出pod install在示例应用程序的文件夹中.
  • 编辑我的Pod课程做了一些有用的事情并添加了import RxSwift一行.
  • 在我的示例应用程序中添加了标签(当然,"Hello World").
  • 使用PureLayout对标签执行所有自动布局约束(并演示Example项目如何访问两个窗格 - 开发窗格以及引用的窗格PureLayout.)

你可以查看我在我的公共GitHub上创建的演示:https: //github.com/ericwastaken/CocoaPod-Dependency-Demo

老实说,我已经使用pod lib create它创建了几个pod ,它确实创建了一个总是适合我的漂亮结构.出于这个原因,我建议始终使用它来创建pod的骨架.

Xcode 8评论:pod lib create似乎仍然创建了一个Swift 1.x项目.因此,在您使用此工具后,当您打开Xcode时,您将被提示"转换"为更新版本的Swift.我会让那个转换发生在那时(第一次),这样你就可以使用Swift 2.x或3.x语法(你选择).


sol*_*ell 4

我最终使用 Carthage 来构建框架依赖项。我想我也可以使用 CocoaPods 来做到这一点。但是,这需要我开始使用工作区,但我不想这样做,以便尽可能减少更改。

另外,对于 Carthage,它不需要我添加新的Podfile/ Podfile.lock,因为 Carthage 将使用已经存在的现有Cartfile/ Cartfile.resolved。这是因为 CarthageCartfile.resolved在另一个项目中使用该框架以及自己构建框架时都使用了 。然而,对于 CocoaPods,*.podspec在另一个项目中使用框架时使用,但 Podfile.lock如果您添加了Podfile)需要在框架本身中安装依赖的 pod。