在使用 CocoaPods 编译期间包含一个目录作为搜索路径

Posted

技术标签:

【中文标题】在使用 CocoaPods 编译期间包含一个目录作为搜索路径【英文标题】:Including a directory as a search path during compilation with CocoaPods 【发布时间】:2019-11-04 08:59:30 【问题描述】:

我正在尝试创建一个包含跨其他平台 (android) 共享的 C 代码的 ios 项目。我正在编译的一些第三方库依赖于将某些目录包含为搜索路径。但是,无论我尝试了什么,我都无法在 CocoaPods .podspec 文件中将给定目录包含在编译搜索路径中。我正在使用 CocoaPods 1.8.4

虽然这是一个 Flutter 插件,但据我了解,这是 CocoaPods/Xcode 的问题,因为 Flutter 只是设置了项目文件。不过值得注意的是,Flutter 设置了一个示例工作区,我不想修改它。我希望插件本身被修改以编译必要的代码,而不是示例工作区/项目。换句话说,我只想修改ios/repro_cocoapods_issue.podspec 文件。

以防万一,我使用以下 Flutter 命令创建项目:

flutter create -t plugin -i objc -a java repro_cocoapods_issue

我在 GitHub here 上有完整的复制品。要重现,请在 Xcode 中打开位于 example/ios/Runner.xcworkspace 的工作区并尝试构建。

这些是我在ios/repro_cocoapods_issue.podspec 文件中尝试过的东西:

s.xcconfig = 'HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.xcconfig = 'USER_HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.user_target_xcconfig = 'HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.user_target_xcconfig = 'USER_HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.pod_target_xcconfig = 'HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.pod_target_xcconfig = 'USER_HEADER_SEARCH_PATHS' => '"$PROJECT_DIR/external/"' s.compiler_flags = '-Iexternal/' s.preserve_paths = 'external/**' s.preserve_paths = '$PROJECT_DIR/external/**'

在所有情况下,我都得到:

'external_dir.c' file not found

如果我将代码更改为#include ../external/external_dir.c,那么它可以工作,但这对我的实际用例没有帮助。

如何配置我的 podspec,以便在编译期间将指定目录包含在搜索路径中?

pod env 的输出

堆栈

   CocoaPods : 1.8.4
        Ruby : ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
    RubyGems : 2.5.2.3
        Host : Mac OS X 10.14.6 (18G95)
       Xcode : 11.1 (11A1027)
         Git : git version 2.23.0
Ruby lib dir : /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib
Repositories : master - git - https://github.com/CocoaPods/Specs.git @ d13a0869021d940f32f0543a03500755b39be998

安装源

Executable Path: /usr/local/bin/pod

插件

cocoapods-deintegrate : 1.0.4
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.0
cocoapods-stats       : 1.1.0
cocoapods-trunk       : 1.4.1
cocoapods-try         : 1.1.0

【问题讨论】:

您不希望将本地包含目录放入 podspec 中,因为它仅适用于您。如果编辑 Xcode 项目并将目录添加到目标的 Header Search Paths 会发生什么? @***foe 不确定您的意思。 “外部”代码将与我的其余代码一起签入,因此它将适用于获取我的 repo 并编译它的任何人。 我假设 Xcode 项目将使用 git 进行跟踪,因此您可以在那里添加目录以及任何必要的构建设置? @***foe 另外,编辑 Xcode 项目正是我需要避免的,因为它是示例项目,而不是插件本身。因此,编辑项目意味着所有正在使用的项目都需要对他们的项目文件进行相同的编辑,重复工作并使其更易编译。 【参考方案1】:

终于弄明白后回答我自己的问题。

某些东西正在积极缓存.podspec 文件的“输出”。导致问题的原因是我正在更改.podspec 并清理+重建,期望这足以接受我的更改,但事实并非如此。如果我改为执行git clean -xdf然后构建,我的更改就会被采纳。

我最终使用了我认为应该可以使用的属性(对上面的内容进行了细微的调整,一旦实际使用了这些选项就很容易理解):

    s.source_files          = [
        'Classes/**/*',
        'shared_c/**/*'
    ]
    s.public_header_files   = [
        'Classes/**/*.h',
        'shared_c/*.h'
    ]
    s.xcconfig              = 
        'HEADER_SEARCH_PATHS' => [
            '"$PODS_TARGET_SRCROOT/shared_c/"'
        ],
        'GCC_PREPROCESSOR_DEFINITIONS' => 'SOME_SYMBOL_FOR_THIRD_PARTY_CODE=1 SOME_OTHER_SYMBOL=1'
    
    s.dependency 'Flutter'

    s.ios.deployment_target = '9.0'

至于为什么文件被如此积极地缓存,我需要与 Flutter 团队一起追查(我希望他们会说这是 CocoaPods/XCode 问题)。

【讨论】:

【参考方案2】:

确保对 podspec 文件的每次编辑都会增加其版本。

假定 CocoaPods podspecs 版本是不可变的并被缓存。请参阅pod cache listpod cache clean

【讨论】:

以上是关于在使用 CocoaPods 编译期间包含一个目录作为搜索路径的主要内容,如果未能解决你的问题,请参考以下文章

[转]CocoaPods安装和使用教程

CocoaPods安装和使用教程

iOS - 如何在使用 cocoapods 开发框架期间管理框架的依赖关系?

cocoapods - ld:框架未找到Pods

如何强制 CocoaPods 使用 Facebook 和 Parse SDK 的二进制版本?

删除项目中的CocoaPods