статические фреймворки и избегайте дублирования класов
Я делаю приложение в свободное время, и я хотел задать вам вопрос, мое приложение для рабочей области имеет 3 подпроекта: презентация, домен и данные, каждый из которых представляет собой статический фреймворк и имеет свои собственные модули, и все это очень круто, но теперь у меня есть проблема, которую я не знаю, как ее решить, у меня есть зависимость, которая должна быть в презентации и в данных, и хотя в Podfile я смог указать, что зависимость Pod Firebase добавлена в презентацию и Данные, проблема возникает при выполнении, потому что это дает мне ошибку: класс FBLPromise реализован в обоих ... Будет использоваться один из двух. Что не определено.
И проблема в том, что это только один из тысяч повторяющихся классов, которые у меня есть в Firebase для следования приведенной выше диаграмме. Я полагаю, что есть способ внедрить зависимость Firebase только один раз и таким образом избежать дублирования классов, но я не знаю, как это сделать.
Мой подфайл:
platform :ios, '13.6'
workspace 'Radar'
def firebase_pods
use_frameworks! :linkage => :static
pod 'Firebase/Core', '7.11.0'
pod 'Firebase/Auth', '7.11.0'
pod 'Firebase/Firestore', '7.11.0'
pod 'FirebaseFirestoreSwift', '7.11.0-beta'
pod 'Firebase/Storage', '7.11.0'
pod 'FirebaseUI/Storage'
end
target 'Radar' do
project 'Radar'
end
target 'PresentationRadar' do
use_frameworks! :linkage => :static
project 'PresentationRadar/PresentationRadar'
pod 'lottie-ios'
# pod 'Hero'
pod 'MaterialComponents'
pod 'YPImagePicker', :path => '../YPImagePicker'
firebase_pods
end
target 'DataRadar' do
use_frameworks! :linkage => :static
project 'DataRadar/DataRadar'
firebase_pods
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = ""
config.build_settings['CODE_SIGNING_REQUIRED'] = "NO"
config.build_settings['CODE_SIGNING_ALLOWED'] = "NO"
end
end
end
1 ответ
Наконец, я решил свою проблему, вдохновленную этим сообщением https://medium.com/@GalvinLi/tinysolution-fix-cocoapods-duplicate-implement-warning-5a2e1a505ea8, потому что это позволило мне понять проблему.
Если я правильно понимаю, OTHER_LDFLAGS добавляет фреймворки по дубликату.
Затем, чтобы избежать проблемы с исходным сообщением
Class *** is implemented in both
Я устанавливаю все модули в целевой CleanExample и удаляю строку OTHER_LDFLAGS из следующих файлов.
- Pods-DataCleanExample.debug.xcconfig
- Pods-DataCleanExample.release.xcconfig
- Pods-PresentationCleanExample.debug.xcconfig
- Pods-PresentationCleanExample.release.xcconfig
Подфайл
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
# Inspired by https://medium.com/@GalvinLi/tinysolution-fix-cocoapods-duplicate-implement-warning-5a2e1a505ea8
platform :ios, '13.6'
workspace 'CleanExample'
use_frameworks!
def data_pods
pod 'Firebase/Core', '7.11.0'
pod 'Firebase/Auth', '7.11.0'
pod 'Firebase/Firestore', '7.11.0'
pod 'Firebase/Storage', '7.11.0'
pod 'FirebaseFirestoreSwift', '7.11.0-beta'
end
def presentation_pods
pod 'FirebaseUI/Storage', '10.0.2'
pod 'Firebase/Storage', '7.11.0'
pod 'lottie-ios'
end
target 'CleanExample' do
project 'CleanExample'
presentation_pods
data_pods
end
target 'PresentationCleanExample' do
project 'PresentationCleanExample/PresentationCleanExample.xcodeproj'
presentation_pods
end
target 'DomainCleanExample' do
project 'DomainCleanExample/DomainCleanExample.xcodeproj'
end
target 'DataCleanExample' do
project 'DataCleanExample/DataCleanExample.xcodeproj'
data_pods
end
post_install do |installer|
removeOTHERLDFLAGS(['PresentationCleanExample', 'DataCleanExample'], installer)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = ""
config.build_settings['CODE_SIGNING_REQUIRED'] = "NO"
config.build_settings['CODE_SIGNING_ALLOWED'] = "NO"
end
end
end
def removeOTHERLDFLAGS(target_names, installer)
pods_targets_names = target_names.map{ |str| 'Pods-' + str }
handle_app_targets(pods_targets_names, installer)
end
def find_line_with_start(str, start)
str.each_line do |line|
if line.start_with?(start)
return line
end
end
return nil
end
def remove_words(str, words)
new_str = str
words.each do |word|
new_str = new_str.sub(word, '')
end
return new_str
end
def handle_app_targets(names, installer)
puts "handle_app_targets"
puts "names: #{names}"
installer.pods_project.targets.each do |target|
if names.index(target.name) == nil
next
end
puts "Updating #{target.name} OTHER_LDFLAGS"
target.build_configurations.each do |config|
xcconfig_path = config.base_configuration_reference.real_path
xcconfig = File.read(xcconfig_path)
old_line = find_line_with_start(xcconfig, "OTHER_LDFLAGS")
if old_line == nil
next
end
new_line = ""
new_xcconfig = xcconfig.sub(old_line, new_line)
File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
end
end
end
Github
Я загрузил код https://github.com/rchampa/CleanExample