美文网首页
用pod改造宿主工程,进行组件剥离

用pod改造宿主工程,进行组件剥离

作者: 大成小栈 | 来源:发表于2024-08-14 11:49 被阅读0次

整体架构为:宿主 << 中间组件库 << 子组件库,其中子组件库内置于中间组件库classes目录中,且只有中间组件库有podspec,子组件库没有podspec只有各自的源码文件夹。

改造过程中有一个需求:独立出去的子组件,均要以源码的形式导入到宿主工程,不能影响正常开发流程。

宿主工程的podfile:

# Uncomment the next line to define a global platform for your project
platform :ios, '14.0'
inhibit_all_warnings!
use_modular_headers!
use_frameworks! # :linkage => :static

source 'https://github.com/CocoaPods/Specs.git'
source 'http://gitlab.test.com/kernel/ios/cocoapods/specs'
# 添加其他源

def app_pods
  
  pod 'YYCache'
  pod 'YYText'
  pod 'YYModel'
  pod 'YYCategories'
  pod 'AFNetworking'
  pod 'Masonry'
  # WebImage
  pod 'SDWebImage'
  pod 'SDWebImageSwiftUI'
  pod 'SDWebImageWebPCoder'
  pod 'MBProgressHUD',:git => 'https://github.com/jdg/MBProgressHUD.git', :commit => '18c442d57398cee5ef57f852df10fc5ff65f0763'

  pod 'ffmpeg-kit-ios-full-gpl', '~> 6.0'
#  pod 'SnapSDK', :subspecs => ['SCSDKCreativeKit']

#  pod 'HXLog', '1.2.0'
  # dokit
  pod 'DoraemonKit/Core', :configurations => ['Debug']

  # Swift 相关 ----
  pod 'Then'
  # CombineExt
  pod 'CombineExt'
  # 约束布局
  pod 'SnapKit'
  # 弹框 吐司
  pod 'AlertToast'
  # 网络组件 Swift
  pod 'Alamofire', '~> 5.8'
  # 网络组件, 依赖 Alamofire
  pod 'Moya/Combine'
  # JSON
  pod 'SwiftyJSON'
  # 加密
  pod 'CryptoSwift'
  # swift数据库
#  pod 'RealmSwift'
  pod 'WCDB.swift'
  # 云存储
  pod 'AWSS3'
  # lottie
  pod 'lottie-ios'
  # log
  pod 'CocoaLumberjack/Swift'
  # HTML解析
  pod 'SwiftSoup', '~> 2.7.0'
end

def inner_pods
  
  pod 'HXELKLog',             :git => 'http://gitlab.test.com/kernel/ios/hxelklog.git'

  pod 'HXPAGVideoLab',        :git => 'http://gitlab.test.com/10jqka/air/phone_assistant/hxpagvideolab.git', :branch => 'main'
  
  pod 'HXDetectSDK',          :git => 'http://gitlab.test.com/heqikai/facedetection.git', :tag => '1.8.2'

  pod 'HXNativeWebEngine',    :git => 'http://gitlab.test.com/kernel/ios/hxnativewebengine.git', :branch => 'work-df', :subspecs => ['Standard', 'webInterceptor']
 


  pod 'DreamPhotoSubmodule/CommonUI', :path => '../DreamPhotoSubmodule/' # :git => "http://gitlab.test.com/10jqka/air/phone_assistant/dfiosmodule.git", :branch => "main"
   pod 'DreamPhotoSubmodule/ThirdService', :path => '../DreamPhotoSubmodule/'
  pod 'DreamPhotoSubmodule/HXService', :path => '../DreamPhotoSubmodule/'

end

target 'HXDreamPhoto' do

  app_pods
  inner_pods
  
end


# 推送扩展

def push_pods
  # 用了收到消息解析失败.....
  pod 'FirebaseMessaging'
  pod 'GoogleUtilities'
  
end


target :HXDreamPhotoPush do
  
  push_pods
  
end


post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
      config.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES'
      config.build_settings['CLANG_WARN_UNGUARDED_AVAILABILITY'] = 'NO'
      # 去除BITCODE、跳过pod签名
      config.build_settings['ENABLE_BITCODE']='NO'
      config.build_settings['EXPANDED_CODE_SIGN_IDENTITY']=""
      config.build_settings['CODE_SIGNING_REQUIRED']="NO"
      config.build_settings['CODE_SIGNING_ALLOWED']="NO"
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"]=""
      
    end
  end
end

#post_install do |installer|
#  #  installer.pods_project.targets.each do |target|
#  #    target.build_configurations.each do |config|
#  #      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
#  #      config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES'
#  #      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
#  #    end
#  #  end
#end

中间组件所在Example工程的podfile:

use_frameworks!

platform :ios, '14.0'

source 'https://github.com/CocoaPods/Specs.git'
source 'http://gitlab.test.com/ios_third_party_libs/Communism'
source 'http://gitlab.test.com/kernel/ios/cocoapods/specs'
source 'http://gitlab.test.com/ios_arsenal/cocoapods/specs'

target 'DreamPhotoSubmodule_Example' do
  
  pod 'DreamPhotoSubmodule/HXService', :path => '../'
  
  pod 'DreamPhotoSubmodule/CommonUI', :path => '../'
  
  pod 'DreamPhotoSubmodule/ThirdService', :path => '../'
  
  pod 'HXThemeSkin',  :git => 'http://gitlab.test.com/kernel/ios/hxthemeskin.git', :branch => 'work-xmw-20230301-theme-skin'
  pod 'LEETheme',     :git => 'http://gitlab.test.com/ios_third_party_libs/leetheme.git'

  pod 'HXAPMonitor',          :git => 'http://gitlab.test.com/kernel/ios/apm-monitor-ios.git', :commit => 'e63145e'
  pod 'HXPAGVideoLab',        :git => 'http://gitlab.test.com/10jqka/air/phone_assistant/hxpagvideolab.git', :branch => 'main'

  target 'DreamPhotoSubmodule_Tests' do
    inherit! :search_paths

  end
end


post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
      config.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES'
      config.build_settings['CLANG_WARN_UNGUARDED_AVAILABILITY'] = 'NO'
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"]=""
    end
  end
end

中间组件的podspec:

#
# Be sure to run `pod lib lint DreamPhotoSubmodule.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#

Pod::Spec.new do |s|
  s.name             = 'DreamPhotoSubmodule'
  s.version          = '0.1.0'
  s.summary          = 'DreamPhoto 项目子模块.'

# This description is used to generate tags and improve search results.
#   * Think: What does it do? Why did you write it? What is the focus?
#   * Try to keep it short, snappy and to the point.
#   * Write the description between the DESC delimiters below.
#   * Finally, don't worry about the indent, CocoaPods strips it!

  s.description      = <<-DESC
  初版, UI、Service等子模块
                       DESC

  s.homepage         = 'http://gitlab.test.com/10jqka/air/phone_assistant/dfiosmodule'
  # s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'sdffdfs' => 'sdfdfs@test.com' }
  s.source           = { :git => 'http://gitlab.test.com/10jqka/air/phone_assistant/dfiosmodule.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.ios.deployment_target = '14.0'

#  s.source_files = 'DreamPhotoSubmodule/Classes/**/*'
  
  # s.resource_bundles = {
  #   'DreamPhotoSubmodule' => ['DreamPhotoSubmodule/Assets/*.png']
  # }

  # s.public_header_files = 'Pod/Classes/**/*.h'
  # s.frameworks = 'UIKit', 'MapKit'
  # s.dependency 'AFNetworking', '~> 2.3'
  
  s.static_framework = true
  s.swift_version = '5.8'
  s.default_subspec = 'Core'
  
  s.subspec "Core" do |ss|
    ss.source_files = 'DreamPhotoSubmodule/Classes/Core/**/*'
    
    ss.dependency 'Then'
    
  end
  
  
  s.subspec "HXService" do |ss|
    ss.source_files = ['DreamPhotoSubmodule/Classes/HXService/**/*', 'DreamPhotoSubmodule/Classes/*.{h,m,swift}']
    ss.dependency 'SSZipArchive'
    ss.dependency 'HXThemeSkin'
    ss.dependency 'LEETheme'
    
#    s.pod_target_xcconfig = {
#      'SWIFT_OBJC_INTERFACE_HEADER_NAME' => 'DreamPhotoSubmodule-Swift.h',
#      'SWIFT_OBJC_BRIDGING_HEADER' => '$(PODS_TARGET_SRCROOT)/DreamPhotoSubmodule/Classes/DreamPhotoSubmodule-Bridging-Header.h'
#    }
  end
  

  s.subspec "ThirdService" do |ss|
    ss.source_files = 'DreamPhotoSubmodule/Classes/ThirdService/**/*'
    
    s.dependency 'HXAPMonitor'
    s.dependency 'SDWebImage'
    s.dependency 'CocoaLumberjack/Swift'
    s.dependency 'SSZipArchive'
    s.dependency 'TikTokOpenSDK'
    s.dependency 'HXPAGVideoLab'
    s.dependency 'libpag'
    s.dependency 'ReactiveObjC'
    
  end

  
  s.subspec "CommonUI" do |ss|
    ss.source_files = 'DreamPhotoSubmodule/Classes/CommonUI/**/*'
    
    s.frameworks = 'UIKit', 'Combine'
    ss.dependency 'DreamPhotoSubmodule/Core'
    
    ss.dependency 'SnapKit'
    ss.dependency 'SDWebImage'
    ss.dependency 'SDCycleScrollView'
    ss.dependency 'lottie-ios'
    ss.dependency 'SwiftyJSON'
    ss.dependency 'WCDB.swift'
    ss.dependency 'CombineExt'

  end
  
end

分别执行过 pod install 后的中间组件 Example 工程的pods目录,宿主工程的pods目录:

问题:如何让独立出去的子组件,在源码和framework两种形式上自由切换?我还不太明白。

相关文章

网友评论

      本文标题:用pod改造宿主工程,进行组件剥离

      本文链接:https://www.haomeiwen.com/subject/orkskjtx.html