บทแนะนำของ Bazel: สร้างแอป iOS

บทแนะนำนี้ครอบคลุมวิธีสร้างแอป iOS อย่างง่ายโดยใช้ Bazel

สิ่งที่คุณจะได้เรียนรู้

ในบทแนะนำนี้ คุณจะได้เรียนรู้วิธีการต่อไปนี้

ตั้งค่าสภาพแวดล้อม

ในการเริ่มต้นใช้งาน ให้ติดตั้ง 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 ต้องมีโปรไฟล์การจัดสรรที่เหมาะสมสำหรับอุปกรณ์รุ่นนั้น ทำดังนี้

  1. ไปที่บัญชีนักพัฒนาแอป Apple แล้วดาวน์โหลดโปรไฟล์การจัดสรรที่เหมาะสมสำหรับอุปกรณ์ ดูข้อมูลเพิ่มเติมได้ใน เอกสารประกอบของ Apple

  2. ย้ายโปรไฟล์ไปที่ $WORKSPACE

  3. (ไม่บังคับ) เพิ่มโปรไฟล์ลงในไฟล์ .gitignore

  4. เพิ่มบรรทัดต่อไปนี้ลงในเป้าหมาย ios_application ในไฟล์ BUILD

    provisioning_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