[Cocoapods]PodfileとPodspecテクニック

13469 ワード

Podfile
  • Podfileはrubyファイルであるため、rubyの関連コンピテンシー
  • を使用することができる.
  • podコマンドはgemモジュール
  • です.
    $ gem list|grep cocoapods
    cocoapods (1.5.3)
    cocoapods-core (1.5.3)
    cocoapods-deintegrate (1.0.2)
    cocoapods-downloader (1.2.1)
    cocoapods-packager (1.5.0)
    cocoapods-plugins (1.0.0)
    cocoapods-search (1.0.0)
    cocoapods-stats (1.0.0)
    cocoapods-trunk (1.3.0)
    cocoapods-try (1.1.0)
    

    podダウンロードのコードライブラリは~/.cocoapods/にインストールされています
  • Podfile具体例
  • source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, '9.0'
    
    install! 'cocoapods', :deterministic_uuids => false
    
    #             ,         podspec      
    #  Cocoapods    ,   source_files     Pods    ,    Pods    。                  。
    
    system("cp -rf ../node_modules/react-native-dop/ios/Dop.podspec .")
    
    target 'myapp' do
        pod 'SDVersion'
       #       
        pod 'Dop',  :path => "."
    end
    

    また、公式にはpre_installpost_installを定義して前処理を行い、target/endの外に置くことに注意してください.そうしないと、予想に達しません.system(‘echo‘hello,world’)デバッグコードを追加してコンパイルプロセスと実行順序を確認することができます.
    pod installの場合、ローカルのpodspecファイルをロードしてpodspecを生成する.jsonファイルはPods/LOcal Podspecディレクトリの下にあるので、pod 'Dop', :path => "."解析の場合、このDop.podspecファイルにはルートディレクトリの下が必要です.そうしないと、コンパイルエラーが発生します.ファイルを別の場所からコピーする必要がある場合は、ルートディレクトリの下に事前にコピーする必要があります.
    プロジェクトの必要性のため、独立したモジュールをstatic libraryにしてnode_に配置します.modulesの下ではnpmが管理するため、このstatic library依存podspecモジュールもルートディレクトリの下に存在せず、pod install時にnode_modulesの下でコピーし、post_installでコードを汚染しないように削除します.
    Dop.podspec
    Pod::Spec.new do |s|
      s.name     = "Dop"
      s.version  = "0.1.1"
      s.license  = "Apache License, Version 2.0"
      s.authors  = { 'gRPC contributors' => '[email protected]' }
      s.homepage = "https://grpc.io/"
      s.summary = "grpc service"
      #s.source = { :git => 'https://github.com/grpc/grpc.git' }
      s.source = { :git => 'https://github.com/sebyddd/SDVersion.git' }
    
      s.ios.deployment_target = "7.1"
      s.osx.deployment_target = "10.9"
    
      # Base directory where the .proto files are.
      src = "../node_modules/react-native-dop/proto"
    
      # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients.
      s.dependency "!ProtoCompiler-gRPCPlugin", "~> 1.0"
    
      # Pods directory corresponding to this app's Podfile, relative to the location of this podspec.
      pods_root = 'Pods'
    
      # Path where Cocoapods downloads protoc and the gRPC plugin.
      protoc_dir = "#{pods_root}/!ProtoCompiler"
      protoc = "#{protoc_dir}/protoc"
      plugin = "#{pods_root}/!ProtoCompiler-gRPCPlugin/grpc_objective_c_plugin"
    
      # Directory where the generated files will be placed.
      dir = "#{pods_root}/#{s.name}"
       
    #     ,         
      s.prepare_command = <<-CMD
      #     Pods/Dop
        mkdir -p #{dir}
    #   protoc  proto  ,     Objective-C  (.m/.h)
        #{protoc} \
            --plugin=protoc-gen-grpc=#{plugin} \
            --objc_out=#{dir} \
            --grpc_out=#{dir} \
            -I #{src}/public \
            -I #{protoc_dir} \
            #{src}/**/*.proto
      CMD
    
    #     Pod     ,  subspec  Messages Group
      # Files generated by protoc
      s.subspec "Messages" do |ms|
        ms.source_files = "#{dir}/*.pbobjc.{h,m}", "#{dir}/**/*.pbobjc.{h,m}"
        ms.header_mappings_dir = dir
        ms.requires_arc = false
        # The generated files depend on the protobuf runtime.
        ms.dependency "Protobuf"
      end
    
      # Files generated by the gRPC plugin
      s.subspec "Services" do |ss|
        ss.source_files = "#{dir}/*.pbrpc.{h,m}", "#{dir}/**/*.pbrpc.{h,m}"
        ss.header_mappings_dir = dir
        ss.requires_arc = true
        # The generated files depend on the gRPC runtime, and on the files generated by protoc.
        ss.dependency "gRPC-ProtoRPC"
        ss.dependency "#{s.name}/Messages"
      end
      
      s.pod_target_xcconfig = {
        # This is needed by all pods that depend on Protobuf:
        'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1',
        # This is needed by all pods that depend on gRPC-RxLibrary:
        'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES',
      }
    end