我正在尝试实现与静态库的弱链接。我读过这两篇文章,《ios上的静态库》;和"Jesse Pinkman如何破解ios上的动态库",这些都很有帮助。
然而,我处于一种我无法实现我想要的情况。我开发了两个框架,我们叫它们Main
和Feature
,它们既可以作为pod安装,也可以作为swift包安装。
Main
不依赖于Feature
,Feature
也不依赖于Main
,但如果Main
和Feature
都存在于开发人员的podfile中,那么Main
可以使用Feature
的功能。这是通过将Framework
的路径添加到Main
的框架搜索路径中来实现的。
Main.podspec
# This works when use_frameworks! is added in the podfile.
s.pod_target_xcconfig = {
"FRAMEWORK_SEARCH_PATHS" => [
"$(inherited)",
"${PODS_CONFIGURATION_BUILD_DIR}/Feature",
],
}
这样,Main
就可以按照以下方式使用Feature
的功能
#if canImport(Feature)
print("SUCCESS!!!")
let feat = Feature()
feat.test()
#else
print(“Failed to import Feature“)
#endif
问题开始时,集成的开发人员不包括use_frameworks!
在他的podfile(例如React Native)。Main
和Feature
然后被构建为静态库,它编译但它永远不会进入SUCCESS块。
阅读了以上文章后,我认为正确的方法应该是如下的
Main.podspec
s.pod_target_xcconfig = {
"LIBRARY_SEARCH_PATHS" => [
"$(inherited)",
"${PODS_CONFIGURATION_BUILD_DIR}/Feature",
],
"SWIFT_INCLUDE_PATHS" => [
"$(inherited)",
"${PODS_CONFIGURATION_BUILD_DIR}/Feature",
],
}
也可以加上
Main.podspec
s.pod_target_xcconfig = {
…
'OTHER_LDFLAGS' => [
"$(inherited)",
'-ObjC',
'-weak_library -l"Feature"'
],
…
}
我已经尝试了上面的Defines module = YES/NO
在Feature
的一侧。
Feature.podspec
s.pod_target_xcconfig = {
'DEFINES_MODULE' => 'YES'
}
然而,以上都不起作用。有人知道我哪里做错了吗,或者给我指指方向吗?
我最后嘲笑了你在这里需要的东西。
但是,我只能解决你的问题的一半(没有use_frameworks
):
Main.podspec
# To include Swift Module
'OTHER_SWIFT_FLAGS' => ['$(inherited)', '-Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/Feature/Feature.modulemap"']
Podspec:
- 不确定为什么
modulemap
文件路径需要与cocoapod安装(可能是当一个库弱链接)
Podfile:
- 没有
use_frameworks
也可以工作 - 它不会与
use_frameworks
工作,因为modulemap
文件不会在指定的路径中找到(因为它只考虑静态路径场景)&Xcode会认为这是必要的。不确定如何在Podspec中选择性地指定modulemap
文件。
我希望我能帮上忙,尽管事情才进行了一半。
@e_pie我认为你想做的是一个post_install的东西,如果你清楚主对的依赖.
所以,你尝试的东西实际上是完美的,但应该放在post_install在App的Podfile:post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "Main"
target.build_configurations.each do |config|
config.build_settings['FRAMEWORK_SEARCH_PATHS'] = "${PODS_CONFIGURATION_BUILD_DIR}/Feature"
end
end
end
end
我希望这对你有帮助,如果没有帮助,请告诉我。