我有一个用Swift编写的应用程序(简称MyApp),其目标如下:
MyApp
MyAppKit
MyAppWidget
该MyAppKit框架链接到使用它的每个目标,即MyApp和MyAppWidget。输入Cocoapods:我以前具有以下Podfile结构:
platform :ios, '8.0' use_frameworks! target 'MyApp' do # Mostly UI or convenience pods pod 'Eureka', '~> 2.0.0-beta' pod 'PKHUD', '~> 4.0' pod '1PasswordExtension', '~> 1.8' end target 'MyAppKit' do # Backend pods for networking, storage, etc. pod 'Alamofire', '~> 4.0' pod 'Fuzi', '~> 1.0' pod 'KeychainAccess', '~> 3.0' pod 'RealmSwift', '~> 2.0' pod 'Result', '~> 3.0' end target 'MyAppWidget' do # Added here event though the target only imports MyAppKit but it worked pod 'RealmSwift', '~> 2.0' end
这里的目的是仅将MyAppKit框架公开给其他部分,而不是将其所有pod 公开(例如,我不希望能够import Alamofire进入主应用程序)。但是,从Cocoapods 1.2.0 RC开始,pod install出现以下错误:[!] The 'Pods-MyApp' target has frameworks with conflicting names: realm and realmswift.。它之所以能够正常工作,是因为Pod是为扩展声明的,但仅嵌入在主机应用程序中(有关更多信息,请参见此问题)。因此,我从小部件的目标中删除了广告连播,只留下了一个空白target 'MyAppWidget'行。
import Alamofire
pod install
[!] The 'Pods-MyApp' target has frameworks with conflicting names: realm and realmswift.
target 'MyAppWidget'
使用此配置,pod install可以正常运行,但在MyAppWidget目标的链接阶段编译失败ld: framework not found Realm for architecture x86_64。可以通过在“链接二进制文件和库”部分中显式添加Realm.framework并将RealmSwift.framework其添加到目标的以下构建设置中来解决此问题Pods- MyAppWidget.[debug/release].xcconfig:
ld: framework not found Realm for architecture x86_64
Realm.framework
RealmSwift.framework
Pods- MyAppWidget.[debug/release].xcconfig
FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Realm" "$PODS_CONFIGURATION_BUILD_DIR/RealmSwift"`
但是,无论何时运行pod install,构建设置都会自然还原,并且我必须再次添加构建设置。
我看到以下解决方案:
post_install
[...] target 'MyAppKit' do # Backend pods for networking, storage, etc. pod 'Alamofire', '~> 4.0' pod 'Fuzi', '~> 1.0' pod 'KeychainAccess', '~> 3.0' pod 'RealmSwift', '~> 2.0' pod 'Result', '~> 3.0' target 'MyAppWidget' do inherit! :search_paths # Because else we get the "conflicting names" error end end
从“窗口小部件应该知道链接期间要看的位置,但本身不需要吊舱”的意义上看,这对我来说很合逻辑, 但这并没有添加上述构建设置(我可能会误解:search_paths继承)(编辑:实际上有效,但不适用于抽象目标)。我想到这个主意是因为在较旧版本的CocoaPods中,解决方案显然要添加link_with,现在已弃用。
:search_paths
link_with
所以,这是我的问题:将Pod集成到主应用程序和扩展之间共享的框架中,同时仍然能够进行编译而又不进行调整和手动添加内容的最佳方法是什么?
预先加油,谢谢!
在[Prientus发表评论之后,]我探索了抽象和继承的可能性。我现在发现的潜在问题实际上是多种多样的:
inherit! :search_paths
使用最后一个选项并手动链接Realm.framework可以工作,但就我的意图和过去的工作而言不是最佳选择。根据Cocoapods的GitHub上的各种 问题 ,其中一些问题似乎是一个错误。我已经添加了自己的问题,并且在有新闻时会更新。
因此,产生了什么:
import RealmSwift
因此,固定的工作Podfile是:
platform :ios, '8.0' use_frameworks! target 'MyApp' do pod 'Eureka', '~> 2.0.0-beta' pod 'PKHUD', '~> 4.0' pod '1PasswordExtension', '~> 1.8' end target 'MyAppKit' do pod 'Fuzi', '~> 1.0' pod 'RealmSwift', '~> 2.0' pod 'Alamofire', '~> 4.0' pod 'KeychainAccess', '~> 3.0' pod 'Result', '~> 3.0' target 'MyAppWidget' do inherit! :search_paths end end
就是这样。我会说旧的行为更加明显,不需要阅读“ podfile目标继承”。我确实学到了很多东西。干杯!