सॉफ़्टवेयर डेवलपर, किसी भी साइज़ या जटिलता वाले किसी भी प्रोजेक्ट को आसानी से बना, टेस्ट, और पैकेज कर सकता है. इसके लिए, ऐसे टूलिंग का इस्तेमाल किया जाता है जिसे आसानी से अपनाया और बढ़ाया जा सकता है.
इंजीनियर, बिल्ड के बुनियादी सिद्धांतों को मानकर चल सकते हैं. सॉफ़्टवेयर डेवलपर, कोड लिखने की क्रिएटिव प्रोसेस पर फ़ोकस करते हैं, क्योंकि बिल्ड और टेस्ट की मैकेनिकल प्रोसेस को हल कर लिया गया है. नई भाषाओं या संगठन की खास ज़रूरतों के हिसाब से बिल्ड सिस्टम को पसंद के मुताबिक बनाने के दौरान, उपयोगकर्ता एक्सटेंसिबिलिटी के उन पहलुओं पर फ़ोकस करते हैं जो उनके इस्तेमाल के उदाहरण के लिए खास होते हैं. इसके लिए, उन्हें बुनियादी प्लंबिंग को फिर से बनाने की ज़रूरत नहीं होती.
इंजीनियर, किसी भी प्रोजेक्ट में आसानी से योगदान दे सकते हैं. कोई डेवलपर, नए प्रोजेक्ट पर काम शुरू करने के लिए, प्रोजेक्ट को क्लोन करके बिल्ड चला सकता है. इसके लिए, लोकल कॉन्फ़िगरेशन की ज़रूरत नहीं होती. यह बस काम करता है. क्रॉस-प्लैटफ़ॉर्म रिमोट एक्ज़ीक्यूशन की मदद से, वे कहीं भी किसी भी मशीन पर काम कर सकते हैं. साथ ही, प्रोजेक्ट के टारगेट वाले सभी प्लैटफ़ॉर्म पर अपने बदलावों की पूरी तरह से जांच कर सकते हैं. इंजीनियर, किसी नए प्रोजेक्ट के लिए बिल्ड को तुरंत कॉन्फ़िगर कर सकते हैं या मौजूदा बिल्ड को धीरे-धीरे माइग्रेट कर सकते हैं.
प्रोजेक्ट, किसी भी साइज़ के कोडबेस और किसी भी साइज़ की टीम के हिसाब से स्केल किए जा सकते हैं. तेज़ और धीरे-धीरे होने वाले टेस्ट की मदद से, टीमें किसी भी बदलाव को कमिट करने से पहले, उसकी पूरी तरह से पुष्टि कर सकती हैं. यह बात तब भी लागू होती है, जब रेपो बढ़ते हैं, प्रोजेक्ट कई रेपो में फैले होते हैं, और कई भाषाओं को शामिल किया जाता है. इन्फ़्रास्ट्रक्चर, डेवलपर को बिल्ड की स्पीड के लिए टेस्ट कवरेज से समझौता करने के लिए मजबूर नहीं करता.
हमारा मानना है कि Bazel में इस विज़न को पूरा करने की क्षमता है.
Bazel को शुरू से ही इस तरह बनाया गया है कि इससे ऐसे बिल्ड तैयार किए जा सकें जिन्हें फिर से बनाया जा सके. इसका मतलब है कि इनपुट का कोई भी सेट हमेशा एक ही आउटपुट देगा. साथ ही, इसे पोर्ट किया जा सके. इसका मतलब है कि किसी बिल्ड को किसी भी मशीन पर चलाया जा सकता है और इससे आउटपुट पर कोई असर नहीं पड़ेगा.
इन सुविधाओं से, सुरक्षित तरीके से धीरे-धीरे बदलाव किए जा सकते हैं. इसका मतलब है कि सिर्फ़ बदले गए इनपुट को फिर से बनाने से, गड़बड़ी होने का खतरा नहीं होता. साथ ही, इन्हें डिस्ट्रिब्यूट किया जा सकता है. इसका मतलब है कि बिल्ड ऐक्शन अलग-अलग होते हैं और इन्हें ऑफ़लोड किया जा सकता है. सही बिल्ड बनाने के लिए ज़रूरी काम को कम करके और उस काम को कई कोर और रिमोट सिस्टम पर पैरलल करके, Bazel किसी भी बिल्ड को तेज़ी से बना सकता है.
Bazel की ऐब्स्ट्रैक्शन लेयर — भाषाओं, प्लैटफ़ॉर्म, और टूलचेन के लिए खास निर्देश, जिन्हें एक्सटेंसिबिलिटी की आसान भाषा में लागू किया जाता है — की मदद से, इसे किसी भी कॉन्टेक्स्ट पर आसानी से लागू किया जा सकता है.
Bazel की मुख्य क्षमताएं
- Bazel, कई भाषाओं और कई प्लैटफ़ॉर्म के लिए बिल्ड और टेस्ट की सुविधा देता है. सोर्स ट्री को बनाने और टेस्ट करने के लिए, एक ही कमांड का इस्तेमाल किया जा सकता है. भले ही, आपने भाषाओं और प्लैटफ़ॉर्म के किस कॉम्बिनेशन को टारगेट किया हो.
- Bazel के बिल्ड तेज़ और सही होते हैं. हर बिल्ड और टेस्ट रन, आपके डेवलपर की मशीनों और सीआई पर धीरे-धीरे होता है.
- Bazel, किसी भी भाषा या प्लैटफ़ॉर्म के लिए बिल्ड तय करने के लिए, एक्सटेंसिबल और एक जैसी भाषा उपलब्ध कराता है.
- Bazel, रिमोट एक्ज़ीक्यूशन और कैशिंग सेवाओं से कनेक्ट करके, आपके बिल्ड को स्केल करने की अनुमति देता है.
- Bazel, डेवलपमेंट के सभी मुख्य प्लैटफ़ॉर्म (Linux, MacOS, और Windows) पर काम करता है.
- हम मानते हैं कि Bazel को अपनाने के लिए मेहनत करनी पड़ती है, लेकिन इसे धीरे-धीरे अपनाया जा सकता है. Bazel, किसी भाषा/प्लैटफ़ॉर्म के लिए, डिफ़ॉल्ट रूप से स्टैंडर्ड टूल के साथ इंटरफ़ेस करता है.
भाषा कम्यूनिटी को सेवाएं देना
सॉफ़्टवेयर इंजीनियरिंग, भाषा कम्यूनिटी के कॉन्टेक्स्ट में विकसित होती है. आम तौर पर, यह ऐसे लोगों के ग्रुप होते हैं जो खुद को व्यवस्थित करते हैं और एक जैसे टूल और तरीकों का इस्तेमाल करते हैं.
भाषा कम्यूनिटी के सदस्यों के लिए, Bazel के बेहतर क्वालिटी वाले नियम उपलब्ध होने चाहिए. ये नियम, उस कम्यूनिटी के वर्कफ़्लो और कन्वेंशन के साथ इंटिग्रेट होने चाहिए.
Bazel, एक्सटेंसिबल और ओपन होने के साथ-साथ, किसी भी भाषा के लिए बेहतर नियमसेट उपलब्ध कराने के लिए प्रतिबद्ध है.
बेहतर नियमसेट की ज़रूरी शर्तें
- नियमों में, भाषा के लिए बिल्ड और टेस्ट की सुविधा होनी चाहिए. इसमें कोड कवरेज भी शामिल है.
- नियमों में, भाषा के लिए बड़े पैमाने पर इस्तेमाल किए जाने वाले "पैकेज मैनेजर" (जैसे, Java के लिए Maven) के साथ इंटरफ़ेस करने की सुविधा होनी चाहिए. साथ ही, बड़े पैमाने पर इस्तेमाल किए जाने वाले अन्य बिल्ड सिस्टम से धीरे-धीरे माइग्रेट करने के पाथ की सुविधा होनी चाहिए.
- नियम एक्सटेंसिबल और इंटरऑपरेबल होने चाहिए. साथ ही, "Bazel सैंडविच" के सिद्धांतों का पालन करना चाहिए.
- नियम रिमोट-एक्ज़ीक्यूशन के लिए तैयार होने चाहिए. असल में, इसका मतलब है कि toolchains के मैकेनिज़्म का इस्तेमाल करके, इन्हें कॉन्फ़िगर किया जा सकता है.
- नियमों (और Bazel) में, भाषा के लिए बड़े पैमाने पर इस्तेमाल किए जाने वाले आईडीई के साथ इंटरफ़ेस करने की सुविधा होनी चाहिए. अगर कोई आईडीई उपलब्ध है, तो.
- नियमों के लिए पूरी और काम की जानकारी देने वाले दस्तावेज़ होने चाहिए. इनमें नए उपयोगकर्ताओं के लिए शुरुआती जानकारी और एक्सपर्ट उपयोगकर्ताओं के लिए पूरी जानकारी देने वाले दस्तावेज़ शामिल होने चाहिए.
इनमें से हर आइटम ज़रूरी है. ये सभी आइटम मिलकर, अपने खास इकोसिस्टम के लिए Bazel की क्षमताओं को पूरा करते हैं.
ये आइटम, आम तौर पर काफ़ी होते हैं. जब ये सभी आइटम पूरे हो जाते हैं, तो Bazel उस भाषा कम्यूनिटी के सदस्यों को अपनी पूरी वैल्यू उपलब्ध कराता है.