当我使用CocoaPods时,“没有这样的模块”


74

这是我的程序。我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
Idris

您正在使用哪个版本的可可豆?
Michael Dautermann 2015年

我相信它0.37.2@MichaelDautermann
Idris

@Idris有完全相同的问题。可能是Xcode 6.3.2+问题。
rb612 2015年

Answers:


100

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

脚步:

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

    在此处输入图片说明

  2. 选择Pods从该计划菜单。
  3. 建立Pods
  4. 从同一菜单中选择项目,然后构建/运行它。

你震撼了!谢谢您:)
Mohsin Khubaib Ahmed

4
在Xcode 11.0中,它现在位于
Product-

32

安装Podfile之后,必须重新打开项目.xcworkspace文件(不是.xcodeproj)。

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

快乐编码:)


1
谢谢!!这正是我所需要的。我对工作区一无所知,并且一直在打开xcodeproj文件。
艾拉·赫尔曼

21

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

pod deintegrate

接着

pod install

这为我解决了这个问题


有时有必要两次运行这些命令...另外,我已经运行rm -rf〜/ Library / Developer / Xcode / DerivedData / *命令
mkul

我这样做了,然后构建了pod方案和库方案,然后它起作用了。
比姆宾(Bhimbim)

这样简单的解决方案,我认为这不会起作用。但是确实如此。谢谢
shoan

18

Command + Option + Shift + K,然后运行您的应用程序,您将看到魔术。

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

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


1
在Xcode项目中安装Pod后出现的“无此模块”错误的数百种解决方案中,这是唯一对我有效的解决方案。+1。
instanceof

忘记了古老的附录,您在其中关闭了某些内容,然后又将其重新打开,即可使用。叹。
Sharan Duggirala

15

不知道这是否还会对其他人有用。但是,就我而言,这最终是一个愚蠢的错误,即没有引用.podspec文件中的依赖项。

我们有一个带有多个内部库的应用程序,这些库之间也有相互依赖关系-我们在Podfiles中解决了这些问题,但在podspecs中却没有考虑。

因此,即使我们的Podfiles具有:

应用程序/ Podfile

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

消费图书馆/ 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”


7

在pod install命令之后尝试使用pod update,这将解决No such module的问题。我只是尝试了,它工作正常。

谢谢,Ratneshwar


3

那些使用多个目标的人,请不要忘记在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

1
哦,男孩,您救了我的命。谢谢 !注意:如果自创建目标以来未进行任何Pod修改,则一切正常,直到执行Pod更新为止,这只是我的事。
库哈

2

当你有一个有时会发生对象-一个吊舱内迅速(即使您使用的项目use_frameworks!.podfile)。

如果您确定已安装Pod,但仍未获得No such module,请尝试以下操作:

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

应该有一个后缀为.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"
}

重建,你应该没事。


2

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


2

也有这个问题。我注意到,Pods/broken_framework_name即使在pod安装或pod更新之后,for框架中的文件夹也产生了错误。因此,对我而言,这些步骤有所帮助:

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

经过所有步骤之后,我注意到丢失的框架文件终于出现了,并且构建再次正常运行。


删除Podfile.lock时要小心。如果未将任何Pod设置为使用特定版本,则最终可能会更新所有Pod,然后需要重构项目。这对于新项目可能很好,但是对于旧项目,这可能意味着要花一些额外的时间来更新代码库。
Rob B

@RobB,感谢您的注释,但是删除Podfile.lock的操作过于频繁,并且一定不能破坏您的代码库。永远不要发生Podfile中的Pod版本设置如此糟糕的情况。未经您特别更改,它不应更新到下一个主要/次要版本。
埃里达娜(Eridana)'20

我完全同意你的看法。但是,这是最佳情况。我遇到的大多数代码库都没有遵循最佳实践,并且没有正确设置这些值。在一个完美的世界中,您不必担心。
Rob B

嗯,是的,我同意。向帖子添加了警告。
埃里达纳(Eridana)

1

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

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

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

例如:在项目文件中,就像0091AB0C861D71C94ADD7240 / * Pods-myframework.release.xcconfig * / = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name =“ Pods-myframework.release.xcconfig”; 路径=“ ../../Apps/MyMainProject/Pods/目标支持文件/Pods-myframework/Pods-myframework.release.xcconfig”;sourceTree =“”; };

完成下面提到的修复后,4444F5B1B35F066E57F96782 / * Pods-myframework.release.xcconfig * / = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name =“ Pods-myframework.release.xcconfig”; path = “ Pods /目标支持文件/Pods-myframework/Pods-myframework.release.xcconfig”;sourceTree =“”; };

要纠正错误,

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

1

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

转到项目文件夹,然后运行以下命令

pod更新您的pod名称

对我来说我需要做

pod更新可达性Swift


0

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


0

当我打开XCode,然后通过文件->打开最近来选择项目的工作区时,我遇到了这个问题。

我发现我的文件系统上有两个.xcworkspace文件,用于相同的工作空间/项目。

通过双击正确的.xcworkspace文件打开XCode可以达到目的。正确的是可行的一种。

后来我删除了错误的。


0

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

帮助我的解决方案:

  1. 复制旧路径

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

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

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

结果看起来像这样(第一行由Xcode添加,第二行由CocoaPods添加,第三行是手动): 在此处输入图片说明


0

如果有多个目标。例如。Target1,Target2

use_frameworks!

target 'Target1' do
 pod 'Fabric'
 pod 'Crashlytics'

   target 'Target2' do
   end

end

然后运行pod install。


0

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





0

我的设定

  • macOS 10.14 Mojave
  • Xcode 10.3
  • 椰子足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项目(包括其所有Framework目标)仍然指向旧位置,因此标头导入和您自己的项目的链接都将失败(您会看到Command PhaseScriptExecution failed with a nonzero exit code何时No such module修复)。

解决方法:

  • 删除所有Pod东西,包括工作区。
  • 使用重新生成Pods项目和工作区pod install。然而,的CocoaPods的硬编码构建产品路径${SRCROOT}/../build,并Pre-configuration Build Products$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)我的情况,这通常指向临时~/Library/Developer子文件夹。仍然不太正确。然后 ....
  • 确保我的项目的Framework Search PathHeader Search Path涵盖以上路径。
  • 调整Pods项目设置和所有依赖项框架Pre-configuration Build Products Path以使用我的首选路径。

道德课:每次触摸Xcode项目设置中的路径时,请始终重新生成Pods并验证关键结果路径。

更新

苹果最终使用Xcode 11消除了令人困惑的“预配置构建产品路径”。要自定义构建产品路径,请Locations在Xcode首选项中使用预先烘焙的全局相对路径。



0

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

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

# 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

-5

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

#import "SwiftyJSON-Swift.h" 

2
use_frameworks!您不需要导入Obj-C标头,就可以导入模块,OP也在使用swift,您在哪里看到需要导入的地方Obj-C
sbarow '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.