Bazel ट्यूटोरियल: iOS ऐप्लिकेशन बनाएं

इस ट्यूटोरियल में, Bazel का इस्तेमाल करके, iOS के लिए कोई आसान ऐप्लिकेशन बनाने का तरीका बताया गया है.

आपको क्या सीखने को मिलेगा

इस ट्यूटोरियल में, आपको इनके बारे में जानकारी मिलेगी:

  • Bazel और Xcode इंस्टॉल करके, सैंपल प्रोजेक्ट डाउनलोड करके, एनवायरमेंट सेट अप करना
  • Bazel वर्कस्पेस सेट अप करना. इसमें ऐप्लिकेशन का सोर्स कोड और एक WORKSPACE फ़ाइल शामिल होती है. यह फ़ाइल, वर्कस्पेस डायरेक्ट्री के टॉप लेवल की पहचान करती है
  • ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल करने के लिए, WORKSPACE फ़ाइल अपडेट करना
  • BUILD फ़ाइल बनाना
  • सिम्युलेटर और iOS डिवाइस के लिए ऐप्लिकेशन बनाने के लिए, Bazel को रन करना
  • सिम्युलेटर और iOS डिवाइस पर ऐप्लिकेशन रन करना

अपना एनवायरमेंट सेट अप करने का तरीका

शुरू करने के लिए, Bazel और Xcode इंस्टॉल करें. साथ ही, सैंपल प्रोजेक्ट डाउनलोड करें.

Bazel इंस्टॉल करना

Bazel और उसकी डिपेंडेंसी इंस्टॉल करने के लिए, इंस्टॉलेशन के निर्देशों का पालन करें.

Xcode इंस्टॉल करना

Xcode डाउनलोड और इंस्टॉल करें. Xcode में कंपाइलर, SDK टूल, और अन्य टूल शामिल होते हैं. Apple के ऐप्लिकेशन बनाने के लिए, Bazel को इनकी ज़रूरत होती है.

सैंपल प्रोजेक्ट डाउनलोड करना

आपको ट्यूटोरियल के लिए, GitHub से सैंपल प्रोजेक्ट भी डाउनलोड करना होगा. GitHub रेपो में दो ब्रांच हैं: source-only और main. source-only ब्रांच में, सिर्फ़ प्रोजेक्ट की सोर्स फ़ाइलें होती हैं. इस ट्यूटोरियल में, इस ब्रांच में मौजूद फ़ाइलों का इस्तेमाल किया जाएगा. main ब्रांच में, सोर्स फ़ाइलें और Bazel की पूरी तरह से तैयार WORKSPACE और BUILD फ़ाइलें, दोनों शामिल होती हैं. ट्यूटोरियल के चरण पूरे करने के बाद, अपने काम की जांच करने के लिए, इस ब्रांच में मौजूद फ़ाइलों का इस्तेमाल किया जा सकता है.

source-only ब्रांच में मौजूद फ़ाइलें डाउनलोड करने के लिए, कमांड लाइन पर यह लिखें:

cd $HOME
git clone -b source-only https://github.com/bazelbuild/examples

git clone कमांड, $HOME/examples/ नाम की डायरेक्ट्री बनाता है. इस डायरेक्ट्री में, Bazel के लिए कई सैंपल प्रोजेक्ट शामिल होते हैं. इस ट्यूटोरियल के लिए प्रोजेक्ट फ़ाइलें, $HOME/examples/tutorial/ios-app में मौजूद हैं.

वर्कस्पेस सेट अप करना

एक वर्कस्पेस एक डायरेक्ट्री होती है. इसमें एक या उससे ज़्यादा सॉफ़्टवेयर प्रोजेक्ट की सोर्स फ़ाइलें, एक WORKSPACE फ़ाइल और BUILD फ़ाइलें शामिल होती हैं. इन फ़ाइलों में वे निर्देश होते हैं जिनका इस्तेमाल Bazel, सॉफ़्टवेयर बनाने के लिए करता है. वर्कस्पेस में, आउटपुट डायरेक्ट्री के सिंबॉलिक लिंक भी शामिल हो सकते हैं.

वर्कस्पेस डायरेक्ट्री, आपके फ़ाइल सिस्टम में कहीं भी मौजूद हो सकती है. इसकी पहचान, रूट में मौजूद WORKSPACE फ़ाइल से होती है. इस ट्यूटोरियल में, आपकी वर्कस्पेस डायरेक्ट्री $HOME/examples/tutorial/ है. इसमें, GitHub रेपो से क्लोन की गई सैंपल प्रोजेक्ट फ़ाइलें शामिल हैं. इन्हें आपने पिछले चरण में क्लोन किया था.

अपनी सुविधा के लिए, अब $WORKSPACE एनवायरमेंट वैरिएबल सेट करें, ताकि यह आपकी वर्कस्पेस डायरेक्ट्री को रेफ़र करे. कमांड लाइन पर, यह लिखें:

export WORKSPACE=$HOME/examples/tutorial

WORKSPACE फ़ाइल बनाना

हर वर्कस्पेस में, WORKSPACE नाम की एक टेक्स्ट फ़ाइल होनी चाहिए. यह फ़ाइल, टॉप-लेवल वर्कस्पेस डायरेक्ट्री में मौजूद होनी चाहिए. यह फ़ाइल खाली हो सकती है या इसमें सॉफ़्टवेयर बनाने के लिए ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल हो सकते हैं.

फ़िलहाल, आपको एक खाली WORKSPACE फ़ाइल बनानी होगी. इसका मकसद सिर्फ़ वर्कस्पेस डायरेक्ट्री की पहचान करना है. बाद के चरणों में, बाहरी डिपेंडेंसी की जानकारी जोड़ने के लिए, आपको इस फ़ाइल को अपडेट करना होगा.

कमांड लाइन पर यह लिखें:

touch $WORKSPACE/WORKSPACE
open -a Xcode $WORKSPACE/WORKSPACE

इससे खाली WORKSPACE फ़ाइल बन जाती है और खुल जाती है.

WORKSPACE फ़ाइल अपडेट करना

Apple डिवाइसों के लिए ऐप्लिकेशन बनाने के लिए, Bazel को Apple के नए बिल्ड नियम GitHub रिपॉज़िटरी से पुल करने होते हैं. इसके लिए, अपनी WORKSPACE फ़ाइल में ये git_repository नियम जोड़ें:

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 नियम का इस्तेमाल करेंगे. इससे Bazel को यह बताया जाएगा कि ऐप्लिकेशन बाइनरी और .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 नियम जोड़ना

ios_application नियम, ऐप्लिकेशन बाइनरी बनाता है और .ipa बंडल फ़ाइल बनाता है.

अपनी 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 एट्रिब्यूट, ऊपर BUILD फ़ाइल में जोड़े गए UrlGetClasses नियम के आउटपुट को कैसे रेफ़र करता है.

अब फ़ाइल सेव करें और बंद करें. GitHub रेपो की main ब्रांच में मौजूद, पूरी तरह से तैयार उदाहरण से अपनी BUILD फ़ाइल की तुलना की जा सकती है.

ऐप्लिकेशन बनाना और डिप्लॉय करना

अब आपके पास अपना ऐप्लिकेशन बनाने और उसे सिम्युलेटर और iOS डिवाइस पर डिप्लॉय करने का विकल्प है.

बनाया गया ऐप्लिकेशन, $WORKSPACE/bazel-bin डायरेक्ट्री में मौजूद होता है.

इस ट्यूटोरियल के लिए, पूरी तरह से तैयार WORKSPACE और BUILD फ़ाइलें, 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 डायरेक्ट्री में मौजूद होते हैं.

सिम्युलेटर में ऐप्लिकेशन रन करना और डीबग करना

अब iOS सिम्युलेटर का इस्तेमाल करके, Xcode से ऐप्लिकेशन रन किया जा सकता है. सबसे पहले, Tulsi का इस्तेमाल करके, Xcode प्रोजेक्ट जनरेट करें.

इसके बाद, Xcode में प्रोजेक्ट खोलें, रनटाइम स्कीम के तौर पर iOS सिम्युलेटर चुनें, और रन करें पर क्लिक करें.

किसी डिवाइस के लिए ऐप्लिकेशन बनाना

अपने ऐप्लिकेशन को इस तरह से बनाने के लिए कि वह iOS डिवाइस पर इंस्टॉल और लॉन्च हो सके, Bazel को उस डिवाइस मॉडल के लिए सही प्रोविज़निंग प्रोफ़ाइल की ज़रूरत होती है. यह तरीका अपनाएं:

  1. अपने Apple डेवलपर खाते पर जाएं और अपने डिवाइस के लिए सही प्रोविज़निंग प्रोफ़ाइल डाउनलोड करें. ज़्यादा जानकारी के लिए, Apple के दस्तावेज़ देखें.

  2. अपनी प्रोफ़ाइल को $WORKSPACE में ले जाएं.

  3. (ज़रूरी नहीं) अपनी प्रोफ़ाइल को .gitignore फ़ाइल में जोड़ें.

  4. अपनी BUILD फ़ाइल में, ios_application टारगेट में यह लाइन जोड़ें:

    provisioning_profile = "<your_profile_name>.mobileprovision",
    

अब अपने डिवाइस के लिए ऐप्लिकेशन बनाएं:

bazel build //ios-app:ios-app --ios_multi_cpus=armv7,arm64

इससे ऐप्लिकेशन, फ़ैट बाइनरी के तौर पर बनता है. किसी खास डिवाइस आर्किटेक्चर के लिए बिल्ड करने के लिए, बिल्ड विकल्पों में उसे तय करें.

Xcode के किसी खास वर्शन के लिए बिल्ड करने के लिए, --xcode_version विकल्प का इस्तेमाल करें. SDK टूल के किसी खास वर्शन के लिए बिल्ड करने के लिए, --ios_sdk_version विकल्प का इस्तेमाल करें. ज़्यादातर मामलों में, --xcode_version विकल्प का इस्तेमाल करना काफ़ी होता है.

iOS के लिए ज़रूरी कम से कम वर्शन तय करने के लिए, अपनी BUILD फ़ाइल में ios_application बिल्ड नियम में, minimum_os_version पैरामीटर जोड़ें.

कमांड लाइन के बजाय, जीयूआई का इस्तेमाल करके अपना ऐप्लिकेशन बनाने के लिए, Tulsi का इस्तेमाल भी किया जा सकता है.

किसी डिवाइस पर ऐप्लिकेशन इंस्टॉल करना

डिवाइस पर ऐप्लिकेशन इंस्टॉल करने का सबसे आसान तरीका है कि Xcode लॉन्च किया जाए और Windows > Devices कमांड का इस्तेमाल किया जाए. बाईं ओर मौजूद सूची में से, प्लग-इन किया गया अपना डिवाइस चुनें. इसके बाद, "इंस्टॉल किए गए ऐप्लिकेशन" में जाकर, जोड़ें (प्लस साइन) बटन पर क्लिक करके ऐप्लिकेशन जोड़ें. इसके बाद, बनाया गया .ipa फ़ाइल चुनें.

अगर आपका ऐप्लिकेशन, डिवाइस पर इंस्टॉल नहीं हो पाता है, तो पक्का करें कि आपने अपनी BUILD फ़ाइल में सही प्रोविज़निंग प्रोफ़ाइल तय की हो (पिछले सेक्शन में चौथा चरण).

अगर आपका ऐप्लिकेशन लॉन्च नहीं हो पाता है, तो पक्का करें कि आपका डिवाइस, आपकी प्रोविज़निंग प्रोफ़ाइल का हिस्सा हो. Xcode में Devices स्क्रीन पर मौजूद, View Device Logs बटन से, यह पता चल सकता है कि क्या गड़बड़ी हुई है.

इस बारे में और पढ़ें

ज़्यादा जानकारी के लिए, GitHub रेपो की मुख्य ब्रांच देखें.