статические фреймворки и избегайте дублирования класов

Я делаю приложение в свободное время, и я хотел задать вам вопрос, мое приложение для рабочей области имеет 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

Другие вопросы по тегам