创建一个依赖于另一个 pod 的 pod

Posted

技术标签:

【中文标题】创建一个依赖于另一个 pod 的 pod【英文标题】:Creating a pod that relies on another pod 【发布时间】:2015-06-01 12:25:24 【问题描述】:

尝试构建一个依赖于我拥有的其他已发布 Cocoapod 库的 Cocoapod 库,在 XCode 中构建了项目,但运行 pod lib lint 命令检查 pod 有效性失败 error: include of non-modular header inside framework module 在我所依赖的库(pod)的头文件中。所有源代码都是 Obj-C 而不是 Swift。

根据here找到的建议,我确实尝试了以下方法

将依赖库的头文件设置为public而不是project 为每个目标设置CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES 验证构建阶段的相关标头是否位于public 下。

但问题仍然存在,我无法发布 pod 也无法对其进行测试。

更新 当我注释掉 s.dependency 'OldPodIDependOn' 我的新 pod 的 podspec 文件中的行,然后错误消失,但未找到依赖的标头。如果我没有在./Example 文件夹下的Podfile 中包含我所依赖的pod,如下所示:

target 'NewPod', :exclusive => true do
  pod "NewPod", :path => "../"
  pod "OldPodIDependOn", :path => "../../OldPodIDependOn/"
end

那么项目将不会在 XCode 中构建,因为 OldPodIDependOn 文件不是项目的一部分。遇到了一些先有鸡还是先有蛋的问题。

更新 2 还尝试删除 :path => "../../OldPodIDependOn/" 组件以引用已发布的 pod 而不是本地的 - 没有帮助。

值得一提的是,这个 pod 将包含一个 UI,因此将包含和引用一个故事板,我在 podspec 文件中添加了 s.resources = 'Pod/Classes/UI/NewPod.storyboard' 行,并从 pod 目标编译源中删除了故事板(否则 xcode 将不会吨建立)。我认为这与问题无关,但值得一提,也许我在那里做错了什么。

我做错了什么? 任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

一般来说,error: include of non-modular header inside framework module 意味着生成的框架内的头文件之一(现在框架和库的 CocoaPods lints)没有存储在框架内,或者被归类为公共头文件。

这通常可以解决将外部imports 移动到实现文件中的方法,请参阅此Modified to support using framework #353。

【讨论】:

我从 NewPod 标头中删除了所有包含 OldPod 标头的内容,并将它们移到了实现文件中。还是不行。现在,我正在尝试构建的 pod 库的两个 H 文件实际上应该是公开的 - 所以当你说“分类为公共标头”时,我不知道你的意思。问题是我得到的错误是构建 OldPod(NewPod 所依赖的那个) - 尽管这个 pod 是活动的并且已发布。还是想不通.. :-/ 有没有办法强制pod lib lint 使用“允许框架模块中的非模块化包含= YES”进行构建?它在 XCode 项目中设置为 YES,不确定这是否会影响 pod lib lint 不,所有元数据都保存在 podspec 中,Xcode 中的任何更改都不会反映在 Pod 中。使用--verbose 运行,您会看到它正在下载并创建自己的 xcodproj。 您可能还必须尝试通过 pod lib lint 运行旧 pod,因为它可能无法被视为框架,而在以前的版本中它很好。【参考方案2】:

我有同样的问题,我用过

pod lib lint MyPod.podspec --allow-warnings --use-libraries

添加 --use-libraries 选项时,它起作用了。

【讨论】:

不错的照片,在此之前我尝试了很多东西。它有效:) 谢谢你【参考方案3】:

为了最终解决这个问题,我不得不放弃 pob lib create 创建的工作区 - 没有办法解决它,我尝试了所有可能的组合/建议/代码修改以摆脱“框架内的非模块化标题”错误,但似乎没有任何效果。 pod lib lint 总是失败。

我从头开始创建了自己的静态库 xcode 项目,然后在将依赖 pod 添加到 Podfile 后在其上运行 pod update,然后为该库创建了一个 .podspec 文件并将依赖 pod 头文件添加到静态库目标 + libPods.a 文件的“复制文件”构建阶段到“使用库链接二进制文件”构建阶段。噗!不再有来自pod lib lint 的“非模块化标题”错误,即使我实际上在做同样的事情。经验教训是 pod lib create 不建议用于所有 cocoapod 案例。

【讨论】:

其实非模块化问题只是在cocoapods构建的时候repos在动态框架中,如果你使用libPods.a来导入,确实没有。 对于 Cocoapod 1.10.0 版,我只是通过在 podspec 中添加 s.dependency 并且根本不接触 Podfile 成功地做到了这一点 - 似乎新版本的 Cocoapods 可以优雅地处理这个问题。

以上是关于创建一个依赖于另一个 pod 的 pod的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 多平台项目依赖于另一个带有 cocoapods 的项目

使用 pod 依赖项创建 Flutter 插件

无法找到由 [PRIVATE POD] 依赖的 [PUBLIC POD] 的规范

在我自己创建的 pod 中添加 Firebase 作为依赖项

如何将 Firebase Analytics 添加为 pod 的依赖项?

Pod 的创建