キャッシュのポッドを使用してiOS 4 xをビルドする方法


私は待つのが嫌いなあの人です⌛ そして、私はIOSのアプリで動作することを決めた幸運だ🙃 (皮肉な)
しかし、とにかく、私はあなたがその痛みを知っていなければならないと思います😞 ときにCIのIOSのアプリを構築する
🖥️ セットアップ(GitHub Actions)を見てみましょう.
  OS: macOS 10.15.7
  CPU: (4) x64 Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz
  Memory: 8.11 GB / 12.00 GB
🗄️ キャッシュサイズ
node_modules: ~852 MB
pods: ~115 MB
pods derived data: ~1258 MB
⏲️ ビルド時間

それで、あなたが私が33 m😲🎉💃!
私は結果を感心し、これらの結果を得る方法をしたいですか?😉
読みました📖 さまざまなアプローチを記述する記事がたくさんあります.
1)ccache
2)Rome tool
3)cocoapods-binary-cache -私にとって奇妙に働いて、ビルド速度に影響を与えない4つの依存関係だけを構築しました.
cocoapods-binary - use_frameworks!を使用するのに必要な
通常、JS側で変更されていますが、ネイティブコードの変更はまれです.ビルド時間の大部分はネイティブコードをビルドします.
それで、主な考えはios/Podfile.lockの変化までポッドビルド結果をキャッシュすることでした
githubアクションを使用する場合、パイプラインは以下のようになります.
jobs:
  build_ios:
    runs-on: macos-latest
    steps:

    # Checkout repo, Install deps (node.js, cocacpods, ruby gems) ...

    - uses: actions/cache@master
      with:
        # Path to Derived Data
        path: .local_derived_data
        # Restore cache by Podfile.lock hashsum  
        key: ${{ runner.os }}-pods-derived-data-${{ hashFiles('**/Podfile.lock') }}

    # Run build
また、私はビルドスクリプトを実行するためにfastlaneツールを使用します.したがって、最適化のないコードは以下のようになります.
# Fastfile
platform :ios do
  desc "Build iOS"
  lane :build do
      # Code sign ...

      gym(
        scheme: "MyApp",
        workspace: "./ios/MyApp.xcworkspace",
        export_method: "ad-hoc",
        configuration: "Release",
        clean: true
      )

      # Publish to firebase...
  end
end
何も特別な、右?と今すぐ最適化とバージョン
platform :ios do
  desc "Build iOS"
  lane :build do
    scheme = "MyApp"
    build_configuration = "Release"
    # !!! Path to the folder that you will cache on CI !!!
    ios_derived_data_path = File.expand_path("../.local_derived_data")
    cache_folder = File.expand_path("#{ios_derived_data_path}/Build/Intermediates.noindex/ArchiveIntermediates/#{scheme}/BuildProductsPath/#{build_configuration}-iphoneos")

    # Code sign ...

    # Step 0) Check if cache exists 

    if(File.exist?(cache_folder))
      # Step 1) Apply a fix of "Copy Pods Resources" Build Phase

      # Before:
      # "${PODS_ROOT}/Target Support Files/Pods-MyApp/Pods-MyApp-resources.sh"
      #
      # After:
      # BUILT_PRODUCTS_DIR=/a/b/c "${PODS_ROOT}/Target Support Files/Pods-MyApp/Pods-MyApp-resources.sh"

      fastlane_require 'xcodeproj'
      project = Xcodeproj::Project.open("../ios/MyApp.xcodeproj")
      target = project.targets.select { |target| target.name == 'MyApp' }.first
      phase = target.shell_script_build_phases.select { |phase| phase.name && phase.name.include?('Copy Pods Resources') }.first
      if (!phase.shell_script.start_with?('BUILT_PRODUCTS_DIR'))
        phase.shell_script = "BUILT_PRODUCTS_DIR=#{cache_folder} #{phase.shell_script}"
        project.save()
      end

      # Step 2) Build only .xcodeproj 
      gym(
        clean: false,
        project: './ios/MyApp.xcodeproj',
        scheme: scheme,
        configuration: build_configuration,
        export_method: "ad-hoc",
        destination: 'generic/platform=iOS',
        export_options: {
          compileBitcode: false,
          uploadBitcode: false,
          uploadSymbols: false 
        },
        xcargs: [
            # Step 3) Provide paths where xcode can't find pods binaries
            "PODS_CONFIGURATION_BUILD_DIR=#{cache_folder}",
            "FRAMEWORK_SEARCH_PATHS='#{cache_folder} $(inherited)'",
            "LIBRARY_SEARCH_PATHS='#{cache_folder} $(inherited)'",
            "SWIFT_INCLUDE_PATHS=#{cache_folder}"
        ].join(" ")
      )
    else

      # Step 4) Build full app .xcworkspace
      gym(
        scheme: "MyApp",
        workspace: "./ios/MyApp.xcworkspace",
        derived_data_path: ios_derived_data_path,
        export_method: "ad-hoc",
        configuration: build_configuration,
        clean: true
      )


      # Step 5) Remove not a Pods binaries to reduce cache size
      require 'fileutils';
      dirs = [
        File.expand_path("#{ios_derived_data_path}/info.plist"),
        File.expand_path("#{ios_derived_data_path}/Logs"),
        File.expand_path("#{ios_derived_data_path}/SourcePackages"),
        File.expand_path("#{ios_derived_data_path}/ModuleCache.noindex"),
        File.expand_path("#{ios_derived_data_path}/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/IntermediateBuildFilesPath/MyApp.build"),
        File.expand_path("#{ios_derived_data_path}/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/IntermediateBuildFilesPath/XCBuildData"),
        File.expand_path("#{ios_derived_data_path}/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/BuildProductsPath/SwiftSupport"),
        File.expand_path("#{ios_derived_data_path}/Build/Intermediates.noindex/ArchiveIntermediates/MyApp/PrecompiledHeaders")
      ]
      dirs.each { |dir| FileUtils.rm_rf(dir) }
    end

    # Publish to firebase...
  end
end
何が起こるかを理解するための注意点
  • まず、キャッシュが存在するか確認します.(Step 0を参照)
  • が存在しない場合は、gym()をデフォルトオプションで呼び出します(Step 4を参照)、新しいオプションderived_data_path: ...を追加します.それから、少しのビットはこのフォルダをきれいにします.(Step 5を参照)
  • キャッシュが正常に復旧した場合、ビルドフェーズ[CP] Copy Pods Resourcesを更新する必要があります.(Step 1を参照)
  • [CP] Copy Pods Resources is run script that CocoaPods automatically adds to your project. It takes care of copying pod resources to the proper directory so that they'll be part of the final archive.

  • 私はgym()を呼び出すことができますが、それは異なる構成を持っています(Step 2を参照してください).今回はワークスペースだけではなくプロジェクトを構築します.私はアプリのプロジェクトを構築するように、私もリンカをリンクするときにリンカを検索するためにいくつかの重要なxcargsを提供する必要があります.(Step 3
  •       gym(
    -        workspace: "./ios/MyApp.xcworkspace",
    +        project: './ios/MyApp.xcodeproj',
    +        xcargs: [
    +            "PODS_CONFIGURATION_BUILD_DIR=#{cache_folder}",
    +            "FRAMEWORK_SEARCH_PATHS='#{cache_folder} $(inherited)'",
    +            "LIBRARY_SEARCH_PATHS='#{cache_folder} $(inherited)'",
    +            "SWIFT_INCLUDE_PATHS=#{cache_folder}"
    +        ].join(" ")
    -        clean: true,
    +        clean: false,
             # ... 
          )
    
    あなたが質問をするならば、私はコメントで彼らを議論するのがうれしいです!
    ミュウミュール