บทแนะนำนี้ครอบคลุมวิธีสร้างแอป iOS อย่างง่ายโดยใช้ Bazel
สิ่งที่คุณจะได้เรียนรู้
ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีการต่อไปนี้
- ตั้งค่าสภาพแวดล้อมโดยการติดตั้ง Bazel และ Xcode รวมถึงดาวน์โหลดโปรเจ็กต์ตัวอย่าง
- ตั้งค่าพื้นที่ทำงาน Bazel ที่มีซอร์สโค้ดสำหรับแอปและไฟล์
WORKSPACEที่ระบุระดับบนสุดของไดเรกทอรีพื้นที่ทำงาน - อัปเดตไฟล์
WORKSPACEให้มีข้อมูลอ้างอิงถึงทรัพยากร Dependency ภายนอกที่จำเป็น - สร้างไฟล์
BUILD - เรียกใช้ Bazel เพื่อสร้างแอปสำหรับโปรแกรมจำลองและอุปกรณ์ iOS
- เรียกใช้แอปในโปรแกรมจำลองและในอุปกรณ์ iOS
ตั้งค่าสภาพแวดล้อม
ในการเริ่มต้นใช้งาน ให้ติดตั้ง Bazel และ Xcode รวมถึงรับโปรเจ็กต์ตัวอย่าง
ติดตั้ง Bazel
ทำตามวิธีการติดตั้งเพื่อติดตั้ง Bazel และ ทรัพยากร Dependency
ติดตั้ง Xcode
ดาวน์โหลดและติดตั้ง Xcode Xcode มีคอมไพเลอร์, SDK และเครื่องมืออื่นๆ ที่ Bazel ต้องใช้ในการสร้างแอปพลิเคชัน Apple
รับโปรเจ็กต์ตัวอย่าง
นอกจากนี้ คุณยังต้องรับโปรเจ็กต์ตัวอย่างสำหรับบทแนะนำจาก GitHub ด้วย ที่เก็บ GitHub มี 2 Branch ได้แก่ source-only และ main Branch source-only มีเฉพาะไฟล์ต้นฉบับของโปรเจ็กต์ คุณจะใช้ไฟล์ใน Branch นี้ในบทแนะนำนี้ Branch main มีทั้งไฟล์ต้นฉบับและไฟล์ WORKSPACE และ BUILD ของ Bazel ที่เสร็จสมบูรณ์แล้ว คุณสามารถใช้ไฟล์ใน Branch นี้เพื่อตรวจสอบงานเมื่อทำตามขั้นตอนในบทแนะนำเสร็จแล้ว
ป้อนคำสั่งต่อไปนี้ในบรรทัดคำสั่งเพื่อรับไฟล์ใน Branch source-only
cd $HOME
git clone -b source-only https://github.com/bazelbuild/examples
คำสั่ง git clone จะสร้างไดเรกทอรีชื่อ $HOME/examples/ ไดเรกทอรีนี้มีโปรเจ็กต์ตัวอย่างหลายรายการสำหรับ Bazel ไฟล์โปรเจ็กต์สำหรับบทแนะนำนี้อยู่ใน $HOME/examples/tutorial/ios-app
ตั้งค่าพื้นที่ทำงาน
พื้นที่ทำงาน คือไดเรกทอรีที่มี ไฟล์ต้นฉบับสำหรับโปรเจ็กต์ซอฟต์แวร์อย่างน้อย 1 รายการ รวมถึงไฟล์ WORKSPACE และไฟล์ BUILD ที่มีคำสั่งที่ Bazel ใช้ในการสร้าง ซอฟต์แวร์ นอกจากนี้ พื้นที่ทำงานยังอาจมีลิงก์สัญลักษณ์ไปยังไดเรกทอรีเอาต์พุตด้วย
ไดเรกทอรีพื้นที่ทำงานสามารถอยู่ในตำแหน่งใดก็ได้ในระบบไฟล์และระบุได้จากการมีไฟล์ WORKSPACE ที่รูท ในบทแนะนำนี้ ไดเรกทอรีพื้นที่ทำงานคือ $HOME/examples/tutorial/ ซึ่งมีไฟล์โปรเจ็กต์ตัวอย่างที่คุณโคลนจากที่เก็บ GitHub ในขั้นตอนก่อนหน้า
ตั้งค่าตัวแปรสภาพแวดล้อม $WORKSPACE ตอนนี้เพื่ออ้างอิงไดเรกทอรีพื้นที่ทำงานเพื่อความสะดวก ป้อนคำสั่งต่อไปนี้ในบรรทัดคำสั่ง
export WORKSPACE=$HOME/examples/tutorial
สร้างไฟล์ WORKSPACE
ทุกพื้นที่ทำงานต้องมีไฟล์ข้อความชื่อ WORKSPACE ซึ่งอยู่ในไดเรกทอรีพื้นที่ทำงานระดับบนสุด ไฟล์นี้อาจว่างเปล่าหรืออาจมีข้อมูลอ้างอิงถึง
ทรัพยากร Dependency ภายนอก ที่จำเป็นในการสร้าง
ซอฟต์แวร์
ตอนนี้คุณจะสร้างไฟล์ WORKSPACE ที่ว่างเปล่า ซึ่งมีไว้เพื่อระบุไดเรกทอรีพื้นที่ทำงานเท่านั้น ในขั้นตอนต่อๆ ไป คุณจะอัปเดตไฟล์เพื่อเพิ่มข้อมูลทรัพยากร Dependency ภายนอก
ป้อนคำสั่งต่อไปนี้ในบรรทัดคำสั่ง
touch $WORKSPACE/WORKSPACE
open -a Xcode $WORKSPACE/WORKSPACE
การดำเนินการนี้จะสร้างและเปิดไฟล์ WORKSPACE ที่ว่างเปล่า
อัปเดตไฟล์ WORKSPACE
หากต้องการสร้างแอปพลิเคชันสำหรับอุปกรณ์ Apple นั้น Bazel ต้องดึงกฎการสร้าง Apple เวอร์ชันล่าสุดจากที่เก็บ GitHub หากต้องการเปิดใช้ฟีเจอร์นี้ ให้เพิ่มกฎ
git_repository
ต่อไปนี้ลงในไฟล์ WORKSPACE
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
git_repository(
name = "build_bazel_rules_apple",
remote = "https://github.com/bazelbuild/rules_apple.git",
tag = "0.19.0",
)
git_repository(
name = "build_bazel_rules_swift",
remote = "https://github.com/bazelbuild/rules_swift.git",
tag = "0.13.0",
)
git_repository(
name = "build_bazel_apple_support",
remote = "https://github.com/bazelbuild/apple_support.git",
tag = "0.7.2",
)
git_repository(
name = "bazel_skylib",
remote = "https://github.com/bazelbuild/bazel-skylib.git",
tag = "0.9.0",
)
ตรวจสอบไฟล์ต้นฉบับ
ดูไฟล์ต้นฉบับของแอปที่อยู่ใน $WORKSPACE/ios-app/UrlGet อีกครั้งว่าตอนนี้คุณเพียงแค่ดูไฟล์เหล่านี้เพื่อทำความคุ้นเคยกับโครงสร้างของแอปเท่านั้น คุณไม่จำเป็นต้องแก้ไขไฟล์ต้นฉบับใดๆ เพื่อทำตามบทแนะนำนี้ให้เสร็จสมบูรณ์
สร้างไฟล์ BUILD
เปิดไฟล์ BUILD ใหม่เพื่อแก้ไขที่พรอมต์บรรทัดคำสั่ง
touch $WORKSPACE/ios-app/BUILD
open -a Xcode $WORKSPACE/ios-app/BUILD
เพิ่มคำสั่งโหลดกฎ
หากต้องการสร้างเป้าหมาย iOS นั้น Bazel ต้องโหลดกฎการสร้างจากที่เก็บ GitHub ทุกครั้งที่เรียกใช้บิลด์ หากต้องการทำให้กฎเหล่านี้พร้อมใช้งานสำหรับโปรเจ็กต์ ให้เพิ่มคำสั่งโหลดต่อไปนี้ที่จุดเริ่มต้นของไฟล์ BUILD
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
คุณต้องโหลดกฎ ios_application เท่านั้น เนื่องจากกฎ objc_library มีอยู่ในแพ็กเกจ Bazel
เพิ่มกฎ objc_library
Bazel มีกฎการสร้างหลายรายการที่คุณใช้สร้างแอปสำหรับแพลตฟอร์ม iOS ได้ สำหรับบทแนะนำนี้ คุณจะใช้กฎ
objc_library ก่อนเพื่อบอก Bazel
วิธีบิลด์ไลบรารีแบบคงที่จากซอร์สโค้ดของแอปและไฟล์ Xib จากนั้น
คุณจะใช้
ios_application
กฎเพื่อบอกวิธีสร้างไบนารีของแอปพลิเคชันและบันเดิล .ipa
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ BUILD
objc_library(
name = "UrlGetClasses",
srcs = [
"UrlGet/AppDelegate.m",
"UrlGet/UrlGetViewController.m",
"UrlGet/main.m",
],
hdrs = glob(["UrlGet/*.h"]),
data = ["UrlGet/UrlGetViewController.xib"],
)
โปรดทราบชื่อกฎ UrlGetClasses
เพิ่มกฎ ios_application
กฎ
จะสร้างไบนารีของแอปพลิเคชันและสร้างไฟล์บันเดิล .ipaios_application
เพิ่มโค้ดต่อไปนี้ลงในไฟล์ BUILD
ios_application(
name = "ios-app",
bundle_id = "Google.UrlGet",
families = [
"iphone",
"ipad",
],
minimum_os_version = "9.0",
infoplists = [":UrlGet/UrlGet-Info.plist"],
visibility = ["//visibility:public"],
deps = [":UrlGetClasses"],
)
โปรดทราบว่าแอตทริบิวต์ deps อ้างอิงเอาต์พุตของกฎ UrlGetClasses ที่คุณเพิ่มลงในไฟล์ BUILD ด้านบน
ตอนนี้ให้บันทึกและปิดไฟล์ คุณสามารถเปรียบเทียบไฟล์ BUILD กับ
ตัวอย่างที่เสร็จสมบูรณ์แล้ว
ใน Branch main ของที่เก็บ GitHub
สร้างและทำให้แอปใช้งานได้
ตอนนี้คุณพร้อมที่จะสร้างแอปและทำให้แอปใช้งานได้ในโปรแกรมจำลองและในอุปกรณ์ iOS แล้ว
แอปที่สร้างขึ้นจะอยู่ในไดเรกทอรี $WORKSPACE/bazel-bin
ไฟล์ WORKSPACE และ BUILD ที่เสร็จสมบูรณ์แล้วสำหรับบทแนะนำนี้จะอยู่ใน
Branch หลัก
ของที่เก็บ GitHub คุณสามารถเปรียบเทียบงานของคุณกับไฟล์ที่เสร็จสมบูรณ์แล้วเพื่อขอความช่วยเหลือเพิ่มเติมหรือแก้ไขปัญหา
สร้างแอปสำหรับโปรแกรมจำลอง
ตรวจสอบว่าไดเรกทอรีการทำงานปัจจุบันอยู่ในพื้นที่ทำงาน Bazel
cd $WORKSPACE
ตอนนี้ ให้ป้อนคำสั่งต่อไปนี้เพื่อสร้างแอปตัวอย่าง
bazel build //ios-app:ios-app
Bazel จะเปิดตัวและสร้างแอปตัวอย่าง โดยเอาต์พุตจะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้ในระหว่างกระบวนการบิลด์
INFO: Found 1 target...
Target //ios-app:ios-app up-to-date:
bazel-bin/ios-app/ios-app.ipa
INFO: Elapsed time: 0.565s, Critical Path: 0.44s
ค้นหาเอาต์พุตของบิลด์
ไฟล์ .ipa และเอาต์พุตอื่นๆ จะอยู่ในไดเรกทอรี $WORKSPACE/bazel-bin/ios-app
เรียกใช้และแก้ไขข้อบกพร่องของแอปในโปรแกรมจำลอง
ตอนนี้คุณสามารถเรียกใช้แอปจาก Xcode โดยใช้ iOS Simulator ได้แล้ว ก่อนอื่น สร้างโปรเจ็กต์ Xcode โดยใช้ Tulsi
จากนั้นเปิดโปรเจ็กต์ใน Xcode เลือก iOS Simulator เป็นสคีมรันไทม์ แล้วคลิกเรียกใช้
สร้างแอปสำหรับอุปกรณ์
หากต้องการสร้างแอปเพื่อให้ติดตั้งและเปิดตัวในอุปกรณ์ iOS ได้นั้น Bazel ต้องมีโปรไฟล์การจัดสรรที่เหมาะสมสำหรับอุปกรณ์รุ่นนั้น ทำดังนี้
ไปที่บัญชีนักพัฒนาแอป Apple แล้วดาวน์โหลดโปรไฟล์การจัดสรรที่เหมาะสมสำหรับอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ใน เอกสารประกอบของ Apple
ย้ายโปรไฟล์ไปที่
$WORKSPACE(ไม่บังคับ) เพิ่มโปรไฟล์ลงในไฟล์
.gitignoreเพิ่มบรรทัดต่อไปนี้ลงในเป้าหมาย
ios_applicationในไฟล์BUILDprovisioning_profile = "<your_profile_name>.mobileprovision",
ตอนนี้ให้สร้างแอปสำหรับอุปกรณ์
bazel build //ios-app:ios-app --ios_multi_cpus=armv7,arm64
การดำเนินการนี้จะสร้างแอปเป็นไบนารีแบบ Fat หากต้องการสร้างสำหรับสถาปัตยกรรมอุปกรณ์ที่เฉพาะเจาะจง ให้ระบุสถาปัตยกรรมนั้นในตัวเลือกบิลด์
หากต้องการสร้างสำหรับ Xcode เวอร์ชันที่เฉพาะเจาะจง ให้ใช้ตัวเลือก --xcode_version หากต้องการสร้างสำหรับ SDK เวอร์ชันที่เฉพาะเจาะจง ให้ใช้ตัวเลือก --ios_sdk_version ตัวเลือก --xcode_version เพียงพอในสถานการณ์ส่วนใหญ่
หากต้องการระบุ iOS เวอร์ชันต่ำสุดที่จำเป็น ให้เพิ่มพารามิเตอร์ minimum_os_version ลงในกฎบิลด์ ios_application ในไฟล์ BUILD
นอกจากนี้ คุณยังใช้ Tulsi เพื่อ สร้างแอปโดยใช้ GUI แทนบรรทัดคำสั่งได้ด้วย
ติดตั้งแอปในอุปกรณ์
วิธีที่ง่ายที่สุดในการติดตั้งแอปในอุปกรณ์คือการเปิด Xcode แล้วใช้คำสั่ง
Windows > Devices เลือกอุปกรณ์ที่เสียบปลั๊กจากรายการทางด้านซ้าย จากนั้นเพิ่มแอปโดยคลิกปุ่มเพิ่ม (เครื่องหมายบวก) ในส่วน "แอปที่ติดตั้ง" แล้วเลือกไฟล์ .ipa ที่คุณสร้างขึ้น
หากแอปติดตั้งในอุปกรณ์ไม่สำเร็จ ให้ตรวจสอบว่าคุณได้ระบุโปรไฟล์การจัดสรรที่ถูกต้องในไฟล์ BUILD (ขั้นตอนที่ 4 ในส่วนก่อนหน้า)
หากแอปเปิดตัวไม่สำเร็จ ให้ตรวจสอบว่าอุปกรณ์เป็นส่วนหนึ่งของโปรไฟล์การจัดสรร ปุ่ม View Device Logs ในหน้าจอ Devices ใน Xcode อาจให้ข้อมูลอื่นๆ เกี่ยวกับสิ่งที่ผิดพลาด
อ่านเพิ่มเติม
ดูรายละเอียดเพิ่มเติมได้ที่ Branch หลัก ของที่เก็บ GitHub