在我的 podspec 中设置 DEFINES_MODULE = YES 有什么缺点吗?

Noa*_*ore 8 ios cocoapods

一些 Cocoapods,例如YLTableView,不会设置'DEFINES_MODULE' => 'YES'为它们的pod_target_xcconfig. 这意味着,例如,import YLTableView除非您:modular_headers => true在 Podfile 中像这样设置,否则在 Swift中不起作用:

pod 'YLTableView', '~> 2.2.0', :modular_headers => true
Run Code Online (Sandbox Code Playgroud)

如果我正在编写 podspec,是否有任何理由不应该像这样在我的配置中包含 DEFINES_MODULE?

ss.pod_target_xcconfig = { "DEFINES_MODULE" => "YES" }
Run Code Online (Sandbox Code Playgroud)

在我看来,这没有任何负面影响,而且它使 Swift 用户可以更轻松地使用我的库。

Cœu*_*œur 4

有一个已知问题(有解决方法):https://github.com/CocoaPods/CocoaPods/issues/7584。对于直接在预编译头文件 (*.pch) 中导入 Objective-C 库头文件的用户来说,这可能会导致问题。您可以通过在 lib 源文件中包含一个空的 swift 文件来解决此问题。CocoaPods 的未来版本很可能会进行彻底的修复。


否则,没有真正的缺点。它在构建时启用更严格的导入搜索路径,这意味着:

  • 要么它构建,并且它像以前一样工作(作为奖励,你现在可以@import在 ObjC 或importSwift 中找到它)
  • 要么它不再构建,因此您无法再发布 podspec

来自有关 CocoaPods 1.5.0 版本的博客文章

[...] CocoaPods 允许任何 pod 导入具有未命名空间引用导入的任何其他 pod。

例如,pod B 的代码可能包含#import“Ah”语句,CocoaPods 将创建允许此类导入成功的构建设置。但是,如果您尝试将模块映射添加到这些 pod,则此类导入将不起作用。很多年前,我们尝试为静态库自动生成模块映射,但它破坏了一些 pod,因此我们不得不恢复。

在此版本中,您将能够选择更严格的标头搜索路径(以及 Objective-C pod 的模块映射生成)。作为 pod 作者,您可以将 'DEFINES_MODULE' => 'YES' 添加到您的 pod_target_xcconfig 中。[...]