创建一个依赖于另一个 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 的项目
无法找到由 [PRIVATE POD] 依赖的 [PUBLIC POD] 的规范
在我自己创建的 pod 中添加 Firebase 作为依赖项