【问题标题】:'No such module' when I use CocoaPods当我使用 CocoaPods 时“没有这样的模块”
【发布时间】:2015-09-12 22:49:48
【问题描述】:

这是我的程序。我在项目目录下新建了一个Podfile,然后我添加了以下内容

platform :ios, '9.0'
use_frameworks!

target 'CPod' do
pod 'AFNetworking', '~> 2.5'
pod 'ORStackView', '~> 2.0'
pod 'SwiftyJSON', '~> 2.1'
end 

我打开pod install,一切顺利,打开xcworkspace。然后我转到ViewController.swift,如果我尝试导入一个pod,我会得到No such module 'SwiftyJSON',如果我要做import SwiftyJSON。有什么想法吗?

编辑:SwiftyJSON 是一个基于 Swift 的模块,而不是 Obj-C

【问题讨论】:

  • AFNetworking 就是这种情况,但情况不同。 SwiftyJSON 是一个 Swift 库,因此该帖子没有回答这个问题。 @Rugmangathan
  • 您使用的是哪个版本的 cocoapods?
  • 我相信它0.37.2@MichaelDautermann
  • @Idris 有完全相同的问题。可能是 Xcode 6.3.2+ 的问题。

标签: ios xcode swift cocoapods


【解决方案1】:

此问题的另一种表现方式:如果您有多个具有不同平台的目标(例如 iOS 和 watchOS),您需要确保您的 podfile 为每个目标指定正确的平台。否则 Cocoapods 可能正在构建正确的 pod,但用于错误的平台,导致“没有这样的模块”错误。

您可以通过指定正确的平台来修复它,例如

# global platform
platform :ios, '11.0'

target 'My Framework' do
  use_frameworks!

  pod 'RxSwift', '~> 5.1'
end

target 'My Framework (watchOS)' do
  # override global platform for this target
  platform :watchos, '4.0'

  use_frameworks!

  pod 'RxSwift', '~> 5.1'
end

【讨论】:

    【解决方案2】:

    就我而言,这是因为我打开了xcodeproj 而不是正确的xcworkspace

    【讨论】:

      【解决方案3】:

      也有这个问题。我注意到 Pods/broken_framework_name 中用于框架的文件夹即使在 pod install 或 pod 更新之后也产生错误是空的。所以,对我来说,这些步骤有所帮助:

      1. 完全关闭XCode
      2. 删除DerivedData
      3. 删除Podfile.lock。在执行此操作之前,请确保您的 pod 已设置为特定版本,并且不会导致不需要的代码更新
      4. 运行pod deintegrate
      5. 删除.xcworkspace文件
      6. 可能是可选步骤:我在所有目标之前写了一般行 use_frameworks!,但也将它包含在我有错误的目标中
      7. 运行pod install

      在完成所有步骤后,我注意到丢失的框架文件终于又出现了,构建又开始工作了。

      【讨论】:

      • 小心删除 Podfile.lock。如果任何 pod 未设置为使用特定版本,您最终可能会更新所有 pod,然后需要重构您的项目。这对于新项目可能没问题,但对于旧项目,这可能意味着要多花几个小时来更新您的代码库。
      • @RobB,感谢您的注意,但删除 Podfile.lock 操作过于频繁,它不能破坏您的代码库。您的 Podfile 中的 pod 版本设置得如此糟糕,绝不能发生这种情况。除非您特别更改它,否则它不应该更新到下一个主要/次要版本。
      • 我完全同意你的看法。然而,这是最好的情况。我遇到的大多数代码库都没有遵循最佳实践,也没有正确设置这些值。在一个完美的世界里,你不必担心它。
      • 嗯,是的,我同意。在帖子中添加了警告。
      【解决方案4】:

      当 pod install 时我收到一些警告:'... target overrides the FRAMEWORK_SEARCH_PATHS build setting defined in ...'。

      修复它并享受它。

      参考:target overrides the FRAMEWORK_SEARCH_PATHS build settings

      【讨论】:

        【解决方案5】:

        那些使用多个目标的人,请不要忘记在 pod 中添加这一行

        def shared_pods
            pod 'SSKeychain', '~> 0.1.4'
            pod 'INAppStoreWindow', :head
            pod 'AFNetworking', '1.1.0'
            pod 'Reachability', '~> 3.1.0'
            pod 'KSADNTwitterFormatter', '~> 0.1.0'
            pod 'MASShortcut', '~> 1.1'
            pod 'MagicalRecord', '2.1'
            pod 'MASPreferences', '~> 1.0'
        end
        
        target 'Target_Name' do
            shared_pods
        end
        
        target 'Target_Name_Two' do
            shared_pods
        end
        

        【讨论】:

        • 天哪,你救了我的命。谢谢 !注意:如果您在创建目标后没有进行任何 pod 修改,那么一切都会正常工作,直到您执行 pod 更新,这恰好发生在我身上。
        【解决方案6】:

        我的设置

        • macOS 10.14 莫哈韦沙漠
        • Xcode 10.3
        • cocoapods 1.7.5

        没有一个答案对我有用,尽管有些答案提供了部分线索。就我而言,根本原因是我在运行 pod install 之后自定义了构建产品路径。

        如果您在创建 Xcode 项目后立即运行 cocoapods,那么如果您打开生成的 Xcode .xcworkspace 而不是 .xcodeproj,它通常可以工作。

        如果您在生成工作区后开始调整构建产品路径,就会发生有趣的事情。因为生成的 Pods 项目及其目标都引用了您旧的 Xcode 项目设置。

        就我而言,我的麻烦来自:

        • 我更喜欢我的所有构建产品都位于项目文件夹$(SRCROOT)/build/$(CONFIGURATION)/$(EFFECTIVE_PLATORM_NAME) 下。所以我继续将我的Pre-configuration Build Products Path 更改为它....在完成pod install之后

        现在,生成的Pods 项目,包括它的所有框架目标,仍然指向旧位置,因此您自己项目的标头导入和链接都将失败(当No such module 时,您会看到Command PhaseScriptExecution failed with a nonzero exit code是固定的)。

        修复:

        • 删除所有 Pod 内容,包括工作区。
        • 使用pod install 重新生成Pods 项目和工作区。但是,在我的情况下,cocoapods 将构建产品路径硬编码为 ${SRCROOT}/../buildPre-configuration Build Products$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME),这通常指向一个临时的 ~/Library/Developer 子文件夹。还是不太对。然后....
        • 确保我自己项目的Framework Search PathHeader Search Path 覆盖上述路径。
        • 调整 Pods 项目设置和所有依赖框架的 Pre-configuration Build Products Path 以使用我的首选路径。

        道德教训:每当您在 Xcode 项目设置中触摸路径时,始终要重新生成 Pod 并验证关键结果路径。

        更新

        在 Xcode 11 中,Apple 终于移除了令人困惑的“预配置构建产品路径”。要自定义构建产品路径,请在 Xcode 首选项中使用 Locations 并预先设置全局相对路径。

        【讨论】:

          【解决方案7】:

          我通常会删除Pods 文件夹和.xcworkspace 文件,然后我再次运行pod install,它在几乎100% 的情况下都有帮助。

          【讨论】:

            【解决方案8】:
            • 清理项目
            • 关闭xcode
            • 打开xcode
            • 享受

            【讨论】:

              【解决方案9】:

              确保导入在 pod 的 .podspec 中定义的正确框架名称。

              【讨论】:

                【解决方案10】:

                我尝试了所有这些建议,但对我没有任何帮助。相反,对我有用的是分解吊舱。然后从 xcode 层次结构中删除 pods 文件夹并进行 pod install。突然,它奏效了。不要问我为什么,因为无论如何,这些建议中的大多数都会被击中或错过,但如果它也适用于其他人,我会很高兴:)

                【讨论】:

                  【解决方案11】:

                  正如@jakub-truhlář 所写,根本问题是由于混合 Swift 和 Objective-C 库的一些并发问题导致缺少 module.modulemap 文件,但与其手动创建这些文件,不如尝试多次清理派生数据并构建您的项目。当项目成功构建后,将 module.modulemap 文件提交到您的存储库以避免丢失这些文件,例如更改当前分支。

                  【讨论】:

                    【解决方案12】:

                    如果有多个目标。 例如。目标1,目标2

                    use_frameworks!
                    
                    target 'Target1' do
                     pod 'Fabric'
                     pod 'Crashlytics'
                    
                       target 'Target2' do
                       end
                    
                    end
                    

                    然后运行 ​​pod install。

                    【讨论】:

                      【解决方案13】:

                      尝试将Pods 框架添加到您的构建方案并构建框架。构建完成后,构建/运行您的项目。

                      步骤:

                      1. 方案菜单 > 管理方案 > 检查 Pods > 关闭

                      2. 从方案菜单中选择Pods
                      3. 构建Pods
                      4. 从同一菜单中选择您的项目,然后构建/运行它。

                      【讨论】:

                      • 你太棒了!谢谢你:)
                      • 在 Xcode 11.0 中,它现在位于 Product -> Scheme -> Manage Schemes 下
                      • 我根本没有豆荚。我该怎么办?
                      【解决方案14】:

                      在将 CocoaPods 添加到旧项目中时遇到了这个问题,该项目之前已经手动包含了库。发生这种情况是因为 Xcode 无法解析 CocoaPods 生成的 Framework Search Path,因为之前在目标设置中设置了值。

                      对我有帮助的解决方案:

                      1. 复制旧路径

                      2. 点击删除以完全清除目标列中的Framework Search Path 设置 - 由 CocoaPods 生成的路径会出现在那里

                      3. 在生成的搜索路径下添加旧的搜索路径(仅当您仍有一些手动添加的框架可供使用时才需要)

                      4. 清理项目,擦除派生数据,构建。

                      结果如下所示(第一行由 Xcode 添加,第二行由 CocoaPods 添加,第三行是手动的):

                      【讨论】:

                        【解决方案15】:

                        我刚刚更新了终端中的特定依赖项

                        转到项目文件夹然后运行下面的命令

                        pod 更新您的 pod 名称

                        对我来说我需要做的

                        pod 更新 ReachabilitySwift

                        【讨论】:

                          【解决方案16】:

                          当我打开 XCode 然后通过 file->open recent 选择我的项目的工作区时遇到了这个问题。

                          我发现我的文件系统上有两个 .xcworkspace 文件用于同一个工作区/项目。

                          双击正确的 .xcworkspace 文件打开 XCode 就可以了。 正确的就是有效的。

                          后来我删错了。

                          【讨论】:

                            【解决方案17】:

                            我在自己开发的 swift 框架中遇到了同样的问题。该框架具有 git 项目的依赖项,并且框架本身作为 pod 添加到我的主项目中。因此,理想情况下,依赖项已在 podspec 文件和 Podfile 中指定。

                            通过我的主项目访问时我没有遇到问题,但是当我独立打开框架时它抛出“没有这样的模块”错误。

                            根本原因是,基本配置设置为指向我的主项目而不是框架本身的路径,因为我首先在我的主项目中运行 podinstall,然后在框架项目中运行。

                            例如:在项目文件中是这样的 0091AB0C861D71C94ADD7240 /* Pods-myframework.release.xcconfig */ = {isa = PBXFileReference;包含索引 = 1; lastKnownFileType = text.xcconfig; name = "Pods-myframework.release.xcconfig"; path = "../../Apps/MyMainProject/Pods/Target 支持文件/Pods-myframework/Pods-myframework.release.xcconfig";源树 = ""; };

                            完成下面提到的修复后, 4444F5B1B35F066E57F96782 /* Pods-myframework.release.xcconfig */ = {isa = PBXFileReference;包含索引 = 1; lastKnownFileType = text.xcconfig; name = "Pods-myframework.release.xcconfig"; path = "Pods/Target 支持文件/Pods-myframework/Pods-myframework.release.xcconfig";源树 = ""; };

                            要修复错误,

                            1. 项目文件 -> 配置 -> 将所有配置设置为 没有。
                            2. 删除 Pods 文件夹和 Podfile.lock。
                            3. 首先在框架项目目录中运行“pod install”,然后在主项目目录中执行 pod install。

                            【讨论】:

                              【解决方案18】:

                              尝试在 pod install 命令后使用 pod update,这将解决 No such module 的问题。 我刚刚试了一下,效果很好。

                              谢谢, 拉特内什瓦尔

                              【讨论】:

                                【解决方案19】:

                                在框架 module.modulemap 文件中添加链接“c++”对我有用

                                【讨论】:

                                  【解决方案20】:

                                  不确定这是否仍然对其他人有帮助。但是,就我而言,它最终成为了一个愚蠢的错误,即没有从 .podspec 文件中引用依赖项。

                                  我们有一个包含多个内部库的应用程序,这些库也相互依赖——我们在 Podfiles 中考虑了这一点......但在 podspecs 中没有。

                                  所以,即使我们的 Podfile 有:

                                  应用程序/Podfile

                                  # Development Pods
                                  pod 'ConsumingLibrary ', :path => '../ios-consuming-lib'
                                  pod 'DependentLibrary1', :path => '../ios-library-one'
                                  pod 'CommonCoreLibrary', :path => '../ios-common-core-lib'
                                  

                                  ConsumingLibrary / Podfile

                                  # Development Pods
                                  pod 'DependentLibrary1', :path => '../ios-library-one'
                                  pod 'CommonCoreLibrary', :path => '../ios-common-core-lib'
                                  

                                  还需要在 .podspec 中注明:

                                  ConsumingLibrary / ConsumingLibrary.podspec

                                    # TODO
                                    # Add here any resources to be exported.
                                  
                                    s.dependency 'DependentLibrary1', '~> 0.1.0-RC'
                                  

                                  DependentLibrary1 / DependentLibrary1.podspec

                                    # TODO
                                    # Add here any resources to be exported.
                                  
                                    s.dependency 'CommonCoreLibrary', '~> 0.1.0-RC'
                                  

                                  我想我浪费了大约 2 个小时试图弄清楚为什么我可以构建 ConsumingLibrary 并运行测试,但是当我构建应用程序时,它消耗了所有三个库 - 我不断得到:

                                  没有这样的模块 'DependentLibrary1'

                                  【讨论】:

                                    【解决方案21】:

                                    当您在 swift 项目中有一个 obj-c pod 时有时会发生(即使您在 .podfile 中使用了 use_frameworks!)。

                                    如果您确定 pod 已安装并且您仍然得到 No such module,请尝试以下操作:

                                    • 在 Xcode 中转到 Pods 项目
                                    • 豆荚
                                    • 右键单击受影响的pod
                                    • 在取景器中显示

                                    应该有一个以.framework为后缀的包文件。在其中创建一个文件夹Modules。在这个文件夹中创建一个名为 module.modulemap 的文件,代码如下:

                                    framework module MODULE_NAME_HERE {
                                      umbrella header "MODULE_NAME_HERE.h"
                                    
                                      export *
                                      module * { export * }
                                    
                                      link framework LINKED_FRAMEWORKS_AND_LIBRARIES_THE_POD_NEEDS_HERE
                                      link framework "AdSupport"
                                      link "c++"
                                      link "z"
                                    }
                                    

                                    重建你应该没问题。

                                    【讨论】:

                                      【解决方案22】:

                                      您必须在安装 podfile 后重新打开项目 .xcworkspace 文件(而不是 .xcodeproj)。

                                      1. 使用 CocoaPods 克隆 repo
                                      2. 打开 YourWorkspace/YourApplication.xcworkspace
                                      3. 选择你想要运行的应用程序在嵌入式中添加 SwiftyJSON.framework 该项目的二进制文件 Hit Run

                                      快乐编码:)

                                      【讨论】:

                                      • 谢谢!!这正是我所需要的。我对工作区一无所知,并且一直在打开 xcodeproj 文件。
                                      • 对我来说很棒!谢谢!
                                      • 真正的窍门是不要从命令行打开“project .xcworkspace”,并确保 xcode 和任何模拟器都已关闭。当您打开 xcode 时,您应该会看到带有蓝色图标的“您的项目”,而“Pods”作为另一个项目也是蓝色的。
                                      • @user1094125 我猜他们会因为名字相似而感到困惑。它发生在我第一次尝试。 :)
                                      【解决方案23】:

                                      您也可以尝试使用以下方法重新安装 pod:

                                      pod deintegrate
                                      

                                      然后

                                      pod install
                                      

                                      这为我解决了这个问题

                                      【讨论】:

                                      • 有时需要运行这些命令两次...另外我已经运行了 rm -rf ~/Library/Developer/Xcode/DerivedData/* 命令
                                      • 我这样做了,然后构建了 pod 方案和库方案,然后它就可以工作了。
                                      • 这么简单的解决方案,我认为这行不通。但确实如此。谢谢
                                      • 这对我也有用。我尝试删除 pod、podfile.lock、.wcworkspace,安装更新版本的 cocoapods,我已经尝试了所有方法,只有这个有效。谢谢!
                                      【解决方案24】:

                                      Command+Option+Shift+K然后运行你的应用程序,你会看到一个神奇的。

                                      或者从菜单 -> 产品中,按键盘上的 Option,您会看到 Clean Build Folder。

                                      Xcode 怎么能和我们一起做这些事情看起来很有趣,但是当我使用 Pod 使用 Swift 库时,同样的事情发生在我身上,经过太多努力,我最终得到了 Clean Build Folder。

                                      【讨论】:

                                      • 在 Xcode 项目中安装 pod 后出现“没有此类模块”错误的数百种解决方案中,这是唯一对我有效的解决方案。 +1。
                                      • 忘记了古老的附录,您在其中关闭某些东西然后再打开它就可以工作。叹息。
                                      【解决方案25】:

                                      为了在 Objective-C 中使用 Swift,你应该导入一个 Xcode 在编译时自动生成的头文件 (NameOfModule+Swift.h)。在这种情况下,您应该尝试在头文件中导入 SwifityJSON,如下所示:

                                      #import "SwiftyJSON-Swift.h" 
                                      

                                      【讨论】:

                                      • use_frameworks! 你不需要导入Obj-C 标头,你导入模块,OP 也在使用 swift 你在哪里看到需要导入Obj-C?跨度>
                                      猜你喜欢
                                      • 2015-12-04
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2023-02-16
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多