キャッシュのポッドを使用してiOS 4 xをビルドする方法
18395 ワード
私は待つのが嫌いなあの人です⌛ そして、私はIOSのアプリで動作することを決めた幸運だ🙃 (皮肉な)
しかし、とにかく、私はあなたがその痛みを知っていなければならないと思います😞 ときにCIのIOSのアプリを構築する
🖥️ セットアップ(GitHub Actions)を見てみましょう.
それで、あなたが私が33 m😲🎉💃!
私は結果を感心し、これらの結果を得る方法をしたいですか?😉
読みました📖 さまざまなアプローチを記述する記事がたくさんあります.
1)ccache
2)Rome tool
3)cocoapods-binary-cache -私にとって奇妙に働いて、ビルド速度に影響を与えない4つの依存関係だけを構築しました.
cocoapods-binary -
通常、JS側で変更されていますが、ネイティブコードの変更はまれです.ビルド時間の大部分はネイティブコードをビルドします.
それで、主な考えは
githubアクションを使用する場合、パイプラインは以下のようになります.
まず、キャッシュが存在するか確認します.( が存在しない場合は、 キャッシュが正常に復旧した場合、ビルドフェーズ 私は
ミュウミュール
しかし、とにかく、私はあなたがその痛みを知っていなければならないと思います😞 ときに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,
# ...
)
あなたが質問をするならば、私はコメントで彼らを議論するのがうれしいです!ミュウミュール
Reference
この問題について(キャッシュのポッドを使用してiOS 4 xをビルドする方法), 我々は、より多くの情報をここで見つけました https://dev.to/retyui/react-native-how-speed-up-ios-build-4x-using-cache-pods-597cテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol