ลดเวลา Build โดยการทำ caching Pods

Sakdinan
te<h @TDG

--

สวัสดีครับ วันนี้ผมจะมาเสนอวิธีการลด build time โดยการทำ caching pods เพราะเวลาที่เรา build ส่วนใหญ่เกิดการที่ไป build 3rd party library ซึ่ง library เราไม่ได้ไปทำการแก้ code ด้วยตัวเองอยู่แล้ว ดังนั้นถ้าไม่ต้อง build pods target ทุกรอบได้จะ save เวลาในการ build ให้เหลือเฉพาะ target ที่ code มีการเปลี่ยนแปลง

pre-requirement:

  1. เริ่มต้นโดยการ install library ผ่าน cocoapods

2. ทดลอง build โดยไม่มี code implement ใน main target
ผลทีได้คือใช้เวลา 150 วินาที

3. เพิ่ม lane สำหรับ build pods target โดยปกติ cocoapods จะมีชื่อเป็น Pods-(ชื่อ main target)

desc “build and save pods target”
lane :build_pods do
xcodebuild(
:project => File.expand_path(‘../Pods/Pods.xcodeproj’),
:scheme => ‘Pods-(main target name)’,
:configuration => ‘Release’,
:destination => ‘generic/platform=iOS’)
end

4. ทดลอง build lane build_pods ใช้เวลา 81 วินาที

5. เพิ่ม lane เพื่อ patch path ในการอ้างอิง

desc “patch app project for pods cache”
lane :patch_pods_cache do
fastlane_require ‘xcodeproj’
project = Xcodeproj::Project.open(“../PodsCacheDemo.xcodeproj”)
target = project.targets.select { |target| target.name == ‘PodsCacheDemo’ }.first
phase = target.shell_script_build_phases.select { |phase|
phase.name.include?(‘Embed Pods Frameworks’) }.first
prefix = [‘if [ -z “${CACHE_BUILT_PRODUCTS_DIR}” ]; then’,
‘ built_products_dir=$BUILT_PRODUCTS_DIR’,
‘else’,
‘ built_products_dir=$CACHE_BUILT_PRODUCTS_DIR’,
‘fi’].join(“\n”)
phase.shell_script = [ prefix,
“BUILT_PRODUCTS_DIR=$built_products_dir #{phase.shell_script}”
].join(“\n”)
project.save()
end

6. ทำการ เรียกใช้ lane patch_pods_cache
เผื่อทำการแก้ run script Embed Pods Frameworks จาก

เป็น

7. เปลี่ยน Framework Search Paths ให้อ่านที่ทำการ cache ไว้

8. เพิ่ม lane สำหรับ build จาก cache data

lane :build_main_project do
cache_folder = File.expand_path(‘../build/Release-iphoneos’)
gym(
project: ‘PodsCacheDemo.xcodeproj’,
scheme: ‘PodsCacheDemo’,
export_method: ‘enterprise’,
xcargs: [
“PODS_CONFIGURATION_BUILD_DIR=#{cache_folder}”,
“CACHE_BUILT_PRODUCTS_DIR=#{cache_folder}”
].join(“ “)
)
end

9. build โดยเลือกใช้ lane build_main_project เวลาที่ใช้จะลดเหลือ 28 วินาที

วิธีนี้จะช่วยเราลดเวลา build และ export IPAในเครื่องเราได้ แต่เมื่อมีการอัพเดต 3rd party library ให้ทำการ เรียกใช้ build_pods เผื่ออัพเดต cache data และยังต่อยอดไปใช้กับระบบ CI/CD ได้อีกด้วย

--

--