首先,我打开了use_framework!在Podfile中。
假设主项目是MAIN_APP,两个子项目是FRAMEWORK_A和FRAMEWORK_B。
MAIN_APP需要FRAMEWORK_A和FRAMEWORK_B,而FRAMEWORK_B也需要FRAMEWORK_A。
所有项目/目标都使用CocoaPods来管理第三方库。
目前,我的Podfile看起来像:
target :MAIN_APP do
project 'MAIN_APP'
pod 'PodA'
end
target :FRAMEWORK_A do
project 'FRAMEWORK_A'
pod 'PodB'
end
target :FRAMEWORK_B do
project 'FRAMEWORK_B'
pod 'PodC'
end
我手动添加了FRAMEWORK_A来构建FRAMEWORK_B的设置,以及FRAMEWORK_A和FRAMEWORK_B来构建MAIN_APP的设置。
所有代码编译良好,但运行MAIN_APP时崩溃,因为它无法加载PodB的框架。
我知道我也可以手动将PodB添加到MAIN_APP和FRAMEWORK_B,但是可以在Podfile中定义这种目标依赖吗?
顺便说一句,当pod install
时,我收到了警告:
[!] Podfile包含框架目标,Podfile不包含主机目标(嵌入框架的目标)。
如果此项目用于框架开发,则可以忽略此消息。否则,将目标添加到嵌入这些框架的Podfile中,以使此消息消失(例如测试目标)。
据我所知,我可以将嵌套目标用于主机目标,例如:
target :FRAMEWORK_A
target :MAIN_APP
end
end
因此CocoaPods将设置MAIN_APP以使用FRAMEWORK_A并从FRAMEWORK_A继承pod依赖项。但似乎我不能用多个依赖项来做,如:
target :FRAMEWORK_A
target :MAIN_APP
end
end
target :FRAMEWORK_B
target :MAIN_APP
end
end
因为目标:MAIN_APP不能被声明两次。
是否有更好的解决方案,而不是将pod依赖项定义为Podfile中的函数并包含在所有目标中?
答案 0 :(得分:2)
这是一个很好的问题,我也遇到过类似情况。这是我的PodFile:
platform :ios, '8.0'
workspace 'mygreatapp.xcworkspace'
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
abstract_target 'This can say whatever you want' do
target 'MyGreatApp' do
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
pod 'AFNetworking', '~> 2.6.0'
pod 'PromiseKit', '~> 1.5'
pod 'PromiseKit/Join'
pod 'KVOController', '~> 1.0'
pod 'FLAnimatedImage', '~> 1.0'
pod 'Crashlytics', '~> 3.3'
pod 'SSZipArchive'
end
target 'MyGreatAppTests' do
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
pod 'OCMock', '~> 3.1'
end
target 'MyGreatFramework' do
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
pod 'SSZipArchive'
end
target 'MyGreatFrameworkTests' do
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
pod 'OCMock', '~> 3.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end
end
正如您所看到的,我没有使用框架,我使用abstract_target
将它们组合在一起。我希望在CocoaPods中更容易做这些依赖。我知道这并没有真正回答你的问题,但它可能会有所帮助。
答案 1 :(得分:1)
我认为您也可以通过将FrameworkA
和FrameworkB
放入本地(静态库)窗格中来解决此问题,它将为您删除重复数据,并将其正确集成到主机应用程序中。
示例:https://github.com/rob-keepsafe/PodFrameworksIssue
master
分支显示重复的类和类似的伞形框架deduped
分支将内部动态框架转换为本地pod(作为静态库)以进行重复数据删除并仍然链接依赖关系答案 2 :(得分:0)
我不能完全确定您的问题与我的问题相同,但是如果有人遇到类似问题,我将在这里保留我的解决方案。
我有一个项目,其中包含多个子项目,这些项目用于模块化我的代码(并可能准备提取到我自己的私有pod中)。 我遇到的一个问题是,将一个外部Pod导入到一个子项目中,并由于“图像丢失”而收到一个dyld错误。
我找到了这篇中型文章,从中得出结论,我必须始终将pod包含在主项目中,以便子项目能够找到它们。我的两个外部Pod均未在主项目中使用。 (https://medium.com/@akfreas/how-to-use-cocoapods-with-your-internal-ios-frameworks-192aa472f64b) (我可能没有尽可能正确或有效地编写Podfile,但这似乎可以解决我的问题)
因此,我的podfile如下:
abstract_target "RandomName" do
target "MainProject" do
inherit! :complete
workspace './MainProject.xcodeproj'
pod 'Moya', '~> 13.0'
pod 'KeychainSwift', '~> 17.0'
end
target "ModuleA" do
project './ModuleA/ModuleA.xcodeproj'
workspace './ModuleA/ModuleA.xcodeproj'
pod 'Moya', '~> 13.0'
end
target "ModuleB" do
project './ModuleB/ModuleB.xcodeproj'
workspace './ModuleB/ModuleB.xcodeproj'
pod 'KeychainSwift', '~> 17.0'
end
end