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

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

आप इन चीज़ों के बारे में जानेंगे

इस ट्यूटोरियल में, आपको यह पता चलेगा कि कैसे:

  • Bazel और Xcode को इंस्टॉल करके एनवायरमेंट सेट अप करें. साथ ही, सैंपल प्रोजेक्ट डाउनलोड करें
  • Bazel वर्कस्पेस सेट अप करें, जिसमें ऐप्लिकेशन का सोर्स कोड होना चाहिए. साथ ही, एक WORKSPACE फ़ाइल सेट अप करनी चाहिए जो Workspace डायरेक्ट्री के टॉप लेवल की पहचान करती हो
  • ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल करने के लिए, WORKSPACE फ़ाइल को अपडेट करें
  • BUILD फ़ाइल बनाएं
  • Bazel चलाकर, सिम्युलेटर और iOS डिवाइस के लिए ऐप्लिकेशन बनाएं
  • इस ऐप्लिकेशन को सिम्युलेटर और 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 को अपने GitHub रिपॉज़िटरी से नए Apple बिल्ड नियमों को हासिल करना होगा. इसे चालू करने के लिए, अपनी 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 नियम का इस्तेमाल करके, आपको ऐप्लिकेशन बाइनरी और .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 नियम के आउटपुट को कैसे दिखाता है.

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

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

अब आप अपना ऐप्लिकेशन बनाने और उसे सिम्युलेटर और 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 डिवाइस पर इंस्टॉल और लॉन्च हो, इसके लिए उसे डिवाइस मॉडल के हिसाब से सही प्रॉविज़निंग प्रोफ़ाइल की ज़रूरत होगी. तो निम्न कार्य करें:

  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 पैरामीटर जोड़ें.

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

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

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

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

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

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

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