c# - 公开 CocoaPods 依赖标头
问题描述
回答我的问题:
因为我没有找到原始问题的答案(即公开通过 CocoaPods 加载的依赖项的标头),所以我不觉得我应该对自己的问题发布答案。但是,我确实找到了解决暴露标题的具体问题的方法。
在我的问题中,我试图使用 Objective Sharpie 为我的框架创建 Xamarin 绑定。我的框架公开了一个扩展 JSONModel 的类,因此需要 JSONModel 头文件来构建这些绑定。
通过阅读 Objective Sharpie 文档,我发现 Clang 有一个“框架目录”命令行参数,它告诉它在哪个目录中查找项目引用的框架。
我只是将JSONModel.framework
andmyframework.framework
放在同一个目录中,然后当我运行 Objective Sharpie 时,我像这样运行它:
sharpie bind -sdk ios myframework.framework/Headers/myframework.h -c -F .
这成功创建了绑定。
我确实遇到了一点小挫折。我可以使用 Objective Sharpie 的-scope
命令行参数,它会输出一个大约 1800 行的文件,其中只有我自己的类的绑定。但是,此文件不包含 JSONModel 的定义,并且在我的 Xamarin 项目中不起作用。如果我不使用该参数,它会为所有内容-scope
创建绑定,包括所有 Foundation。这创建了一个大约 ~84000 行的文件。
为了解决这个问题,我手动将 JSONModel 绑定从 84000 行文件复制到 1800 行文件,并且效果很好。
问题:
我有一个用 Objective-C 编写的框架。该框架有 3 个依赖项(即CocoaLumberjack
、Google-IMA-iOS-SDK
和JSONModel
)
在我的框架内,我有一个这样定义的公共类:
广播.h
#import <JSONModel/JSONModel.h>
@interface Broadcast : JSONModel
@property (nonatomic) NSString *title;
@proeprty (nonatomic) NSString *url;
@end
当我构建我的框架时,它工作得很好。当我将我的框架导入到一个 Objective-C 项目中时(并包含 JSONModel 框架,因为它是一个依赖项),它工作得很好。当我使用 CocoaPods 安装我的框架时,它工作得很好。
当我尝试使用Objective Sharpie为我的框架创建 C# 绑定(用于 Xamarin)时,问题出现了
当我跑的时候:
sharpie bind -sdk ios myframework.framework/Headers/myframework.h
我得到了错误:Cannot find JSONModel.h
具体来说,它正在我的框架中寻找JSONModel.h 。这不是 CocoaLumberjack 或 Google IMA SDK 的问题,因为它们是严格的实现细节,而且我的公共标头都没有引用它们。然而,当谈到 JSONModel 时,它的接口实际上是我的公共 API 的一部分。
有没有办法将 JSONModel.h (和所有其他 JSONModel 标头)的副本放在我的输出Headers
目录中?或者,以其他方式告诉Objective Sharpie 在多个框架中查找绑定?
更新
快速更新,因为在过去的一个小时里我一直在处理这个问题。通过告诉 Clang 在哪里可以找到并调整我的代码,我能够让 Objective Sharpie至少运行:JSONModel.h
广播.h
#import <JSONModel.h> // <-----
@interface Broadcast : JSONModel
@property (nonatomic) NSString *title;
@proeprty (nonatomic) NSString *url;
@end
然后在运行 Objective Sharpie 时:
sharpie bind -sdk ios -scope myframework.framework/Headers myframework.framework/Headers/myframework.h -c -IJSONModel.framework/Headers
这工作得更好一点,但遇到了一个问题,给我留下了一个问题:
- 在生成的绑定文件中,它
typeof(JSONModel)
在几个地方说,没有定义并抛出错误。我可以通过删除-scope
参数来解决这个问题,但这会创建一个 84000 行长而不是 1800 行长的绑定文件,并且包括 AFNetworking、AVPlayer 等内容的绑定。 - 我之前导入的原因
<JSONModel/JSONModel.h>
既是因为这是我一直看到导入 CocoaPods 依赖项的方式,也是因为它是自动完成推荐的。那么为什么导入<JSONModel.h>
也同样有效呢?这会在未来破坏一些东西吗?
为了在不生成 84000 行绑定文件的情况下更正范围问题,我还尝试使用.
or之类的范围,"$(pwd)"
但没有任何效果。它要么创建了一个没有 JSONModel 定义的 1800 行文件,要么创建了一个包含所有内容定义的 84000 行文件
更新 2
虽然我仍然不完全理解 和 之间的区别<JSONModel/JSONModel.h>
,<JSONModel.h>
但我确实学到了一些东西:
- 任何一个都允许我
.framework
直接从我的框架项目构建一个文件 - 只有
<JSONModel/JSONModel.h>
当我尝试通过应用程序内的 CocoaPods 导入我的框架时才有效 - 仅
<JSONModel.h>
当我尝试使用 Objective Sharpie 创建 C# 绑定时才有效
这样就取消了该解决方案
解决方案
关于<X/X.h>
vs<X.h>
Clang 有一个内置的“框架”概念(您可以使用-F
标志指定框架搜索目录)。当您使用<X/*>
导入语法时,Clang 将搜索名为X
. CocoaPods 通过使用这个-F
标志来引用导入的依赖,所以你必须使用它来适当地导入第三方框架
同时,更简单的<X.h>
导入语法是大多数 C 编译器中的标准语法,即“检查 X 的标头搜索路径”。Xcode 会自动将您项目中的所有内容添加到此搜索路径中,因此它往往可以工作——但这不是一个好的做法,并且可能导致诸如 CocoaPods 损坏之类的事情
解决我的问题
我从来没有找到一种自动化的方式来公开第三方框架头文件。您当然可以在构建阶段使用“运行脚本”阶段将标头从其框架复制到您自己的框架中,但这很难看。我最终做的是编写一个小的 Python 脚本来生成我的 Xamarin 绑定,它在我自己之前注入了所有 JSONModel 绑定
推荐阅读
- python-3.x - 有没有办法将所有变量传递给python中的函数
- function - 如何在 Rust println 中直接使用函数返回值
- flutter - 如何使用 Dart 将新用户推送到 Firebase 数据库?
- sed - 如何使用 sed 将字符串添加到文件中的特定行?
- flutter - 如何在颤动中从另一个屏幕进行更改
- npm - gatsby 的全新安装失败,找不到模块“检测端口”
- javascript - 当人们加入我的服务器时,这个不和谐的机器人不会工作?
- javascript - AssyncStorage 在构建时保存数据
- c# - 如何将变量从一个类引用到另一个类?
- python - 安装 libact 时找不到“lapacke.h”文件错误