首页 > 解决方案 > 如何配置具有(本地)框架依赖项(podspec 和 xcodeproj)的 Cocoapod?

问题描述

经过大量阅读,我比以往任何时候都更加困惑......我正在尝试将客户端 SDK 项目转换为 pod(和/或 SPM)。在此之前,它使用 podfile 来创建和链接到本地​​框架依赖项(repo 中但在 xcode 项目之外的 podspec)。这是因为 SDK 与使用它的客户端应用程序共享一个接口。依赖关系图如下所示:

ExampleApp
|- InterfaceFramework
|-SDK
   |- InterfaceFramework

我不清楚如何设置它,以便它SDK是一个可以自行构建的 pod(以生成供外部客户端使用的框架)。它需要知道在哪里,InterfaceFramework否则我会No such module出错。但这InterfaceFramework是由 ExampleApp 的 Podfile 生成的...?

配置这个的正确方法是什么?

SPM 指令的奖励业力也是如此!(虽然如果我能接受 cocoapods 那么希望会随之而来)

标签: xcodeframeworkscocoapodsswift-package-manager

解决方案


好的,也许 Cocoapods.org 没有明确说明的第一件事是,如果您正在制作的 Pod 具有依赖关系,那么它拥有自己的 Podfile 是正确的。换句话说,cocoapod 可以使用 cocoapods ......也许我很愚蠢,但这对我来说并不是很直观。

该 Podfile只是为了让您的 pod 代码在本地构建(编译/链接),这是推送 podspec 的要求(无论是私有 podspec 存储库还是 CP 公共存储库)。请注意,当您的 pod 代码被客户端项目拉入时,它只会拉取您的代码。它不会对 pod 的 podfile 做任何事情,也不会打包这些依赖项。使用您的 pod 的客户端应用程序需要处理它们(在它们的 podfile、手动框架导入等中)

完整性检查:如果您的 pod 没有任何依赖项,则它不需要在 podfile 中表示(作为目标)。但是...如果您的 pod 存储库中有一个演示项目,那么仍然会有一个 podfile(用于提取您的 pod 代码)。

新手/心不在焉的注意事项:一个 podfile 涵盖了您工作区中的所有目标 - 在本例中是您的 pod 代码和演示应用程序。这些“目标”是独立的(除非你嵌套它们或其他东西)。

下一条: Podspec 不会告诉你从哪里获取依赖项,只是告诉你的 pod 有它们。但是... pod lib lintorpod repo push验证将在您指定的任何 podspec 存储库中查找依赖项(默认为公共 CP 之一)。对于公共依赖关系很好,但对于本地非托管开发依赖关系,它将无法找到它们。IMO 有点蹩脚,你的 podfile 可以说依赖是本地的(即“开发 pod”),但不能告诉 podspec 验证器。这可能是因为 CP 最初是为开源项目构建的......

所以......您还需要将本地依赖项的 podspec 推送到您的私有 podspec 存储库。这意味着使用您的 pod 的任何人都需要可以访问依赖项存储库。

如果您真的(真的)希望它们仅在您的机器上本地使用(如果不跳过本段......相信我),那么您必须在本地的文件夹中设置另一个私有 podspec 存储库,仅用于依赖项。您需要另一个私有 podspec 存储库的原因是因为您肯定仍然希望您的 pod 的 podspec 远程可用(即非本地),否则没有人能够拉动您的 pod,从而破坏了拥有一个的意义......

健全性检查:所以...忽略上面的段落...您的私有 podspec 存储库将有几个条目:您的 pod 的 podspec,以及您的每个私有依赖项的 podspec。

NEXT ...您就快到了!...当您想要 lint/push pod 的 podspec 时,您需要通过--sources:repo1,repo2,.... 仅使用系统注册的还不够聪明。嘘。

此外,您可能希望使用一系列定义模糊、看似重叠且违反直觉的标志来控制验证野兽,因为毕竟,您并不真正关心 CP 对您的私有 pod 代码的看法,只要 It Just Works™ . 这是我的一个例子......

pod repo push MyPrivatePodSpecRepo MyShinyNewPod.podspec --skip-tests --private --allow-warnings --skip-import-validation --sources=git@github.com:SnazzyCo/MyPrivatePodSpecRepo.git,https://cdn.cocoapods.org/

还有一些注意事项...

--skip-import-validation— 这不适用于依赖项,仅适用于 pod 本身。

你会认为--include-podspecs=MyLocalUnHostedPods/**/*会为你省去所有这些麻烦,但事实并非如此。

我认为--private实际上只是为了pod lib lintpod repo push有一个--no-private标志),但我太害怕删除它......

pod repo push基本上就pod lib lint这样免去了自己后面的麻烦。除了你可以跑来pod lib lint --quick检查语法(我认为)

最后:

  • 不要忘记让客户端应用程序使用您的私有 pod 来添加source 'urlToMyPrivatePodspecRepo'他们的 podfile 的顶部。
  • 我不记得为什么了,但是为了让我的 pod repo 中的 DemoApp 正确使用 pod,我必须pod MyShinyNewPodpodspec :path => 'MyShinyNewPod.podspec'

推荐阅读