इस पेज पर, डेटा स्टोर करने के नियम बनाने का तरीका बताया गया है. साथ ही, देखें.
एक्सटर्नल रिपॉज़िटरी एक ऐसा नियम है जिसका इस्तेमाल सिर्फ़ किया जा सकता है
यह WORKSPACE
फ़ाइल में होता है और लोड होने के दौरान, नॉन-हर्मेटिक ऑपरेशन को चालू करता है
का नाम है. हर एक्सटर्नल रिपॉज़िटरी नियम अपना फ़ाइल फ़ोल्डर बनाता है, जिसमें
BUILD
फ़ाइलों और आर्टफ़ैक्ट का मालिकाना हक है. इनका इस्तेमाल तीसरे पक्ष पर निर्भर रहने के लिए किया जा सकता है
लाइब्रेरी (जैसे कि Maven के पैकेज की गई लाइब्रेरी) लेकिन BUILD
फ़ाइलों को भी जनरेट करने के लिए
विशिष्ट रूप से होस्ट Basel चल रहा है.
डेटा स्टोर करने के लिए नियम बनाना
.bzl
फ़ाइल में,
नई फ़ाइल बनाने के लिए repository_rule फ़ंक्शन का इस्तेमाल करें
रिपॉज़िटरी नियम का इस्तेमाल करके उसे ग्लोबल वैरिएबल में सेव करें.
कस्टम रिपॉज़िटरी के नियम का इस्तेमाल, नेटिव रिपॉज़िटरी के नियम की तरह ही किया जा सकता है. यह
एक ज़रूरी name
एट्रिब्यूट है और हर टारगेट उसकी बिल्ड फ़ाइलों में मौजूद है
को @<name>//package:target
कहा जा सकता है, जहां <name>
name
एट्रिब्यूट की वैल्यू सबमिट करें.
नियम तब लोड होता है, जब आप इसे साफ़ तौर पर बनाते हैं या अगर यह
बिल्ड. इस मामले में, Basel अपने implementation
फ़ंक्शन को एक्ज़ीक्यूट करेगा. यह
फ़ंक्शन के बारे में बताती है कि रिपॉज़िटरी, उसका कॉन्टेंट, और BUILD
फ़ाइलें कैसे बनाई जाती हैं.
विशेषताएं
एट्रिब्यूट, नियम वाला आर्ग्युमेंट होता है, जैसे कि url
या sha256
. आपको ज़रूर सूची बनानी चाहिए
एट्रिब्यूट और उनके प्रकार जब आप डेटा स्टोर करने की जगह के लिए नियम तय करते हैं.
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
किसी एट्रिब्यूट को ऐक्सेस करने के लिए, repository_ctx.attr.<attribute_name>
का इस्तेमाल करें.
सभी repository_rule
में, सीधे तौर पर तय किए गए एट्रिब्यूट होते हैं (बिल्ड की तरह)
नियम). दो इंप्लिसिट एट्रिब्यूट name
हैं (बिल्ड रूल की तरह) और
repo_mapping
. डेटा स्टोर करने की जगह के नियम के नाम को इससे ऐक्सेस किया जा सकता है
repository_ctx.name
. repo_mapping
का मतलब वही है जो
डेटा स्टोर करने के लिए नेटिव नियम
local_repository
और
new_local_repository
.
अगर किसी एट्रिब्यूट का नाम _
से शुरू होता है, तो यह 'निजी' के तौर पर सेट होता है और उपयोगकर्ता इसे सेट नहीं कर सकते.
लागू करने का फ़ंक्शन
डेटा स्टोर करने के हर नियम के लिए, implementation
फ़ंक्शन ज़रूरी होता है. इसमें
नियम का तर्क होना चाहिए और इसे पूरी तरह से लोड होने के चरण के दौरान लागू किया जाता है.
इस फ़ंक्शन में सिर्फ़ एक इनपुट पैरामीटर, repository_ctx
है. फ़ंक्शन
यह बताने के लिए कि नियम को फिर से बनाया जा सकता हैNone
किसी खास पैरामीटर का इस्तेमाल करें या उस नियम के लिए पैरामीटर के सेट के साथ ऐसा डिक्शनरी देखें जिसमें
उस नियम को उसी डेटा संग्रह स्थान को जनरेट करने वाले फिर से जनरेट किए जाने वाले नियम में बदल देगा. इसके लिए
उदाहरण के लिए, एक git रिपॉज़िटरी को ट्रैक करने वाले नियम का मतलब
किसी फ़्लोटिंग ब्रांच के बजाय, खास तौर पर जनरेट किया गया आइडेंटिफ़ायर
बताया गया है.
इनपुट पैरामीटर repository_ctx
का इस्तेमाल, इनके लिए किया जा सकता है
एट्रिब्यूट की वैल्यू और नॉन-हर्मेटिक फ़ंक्शन ऐक्सेस करें (बाइनरी ढूंढना,
बाइनरी प्रोसेस करना, रिपॉज़िटरी में फ़ाइल बनाना या कोई फ़ाइल डाउनलोड करना
इंटरनेट से मिलता है). ज़्यादा जानकारी के लिए लाइब्रेरी देखें
संदर्भ. उदाहरण:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
लागू करने का फ़ंक्शन कब चलाया जाता है?
अगर रिपॉज़िटरी (डेटा स्टोर करने की जगह) को local
के तौर पर एलान किया गया है, तो डिपेंडेंसी में बदलाव करें
डिपेंडेंसी ग्राफ़ में (WORKSPACE
फ़ाइल भी शामिल है)
इसकी वजह से, लागू करने वाले फ़ंक्शन को एक्ज़ीक्यूट किया जा सके.
अगर लागू करने पर फ़ंक्शन लागू होता है, तो उसे फिर से शुरू किया जा सकता है अनुरोध की वैल्यू मौजूद नहीं है. लागू करने वाले फ़ंक्शन की शुरुआत डिपेंडेंसी रिज़ॉल्व होने के बाद, फिर से लागू की जाएगी. इससे बचने के लिए बेवजह रीस्टार्ट हो सकता है. हालांकि, नेटवर्क का ऐक्सेस बहुत महंगा होता है, बार-बार इस्तेमाल करना पड़ता है), तो लेबल के आर्ग्युमेंट प्रीफ़ेच किए जाते हैं, बशर्ते सभी लेबल आर्ग्युमेंट को किसी मौजूदा फ़ाइल में रिज़ॉल्व किया जा सकता है. ध्यान दें कि समाधान करना किसी स्ट्रिंग या लेबल में मौजूद पाथ, जिसे सिर्फ़ एक्ज़ीक्यूशन के दौरान बनाया गया था फ़ंक्शन के इस्तेमाल करने के बाद भी रीस्टार्ट हो सकता है.
आखिर में, डेटा स्टोर करने की local
से बाहर की जगहों के लिए, सिर्फ़ इन डेटा स्टोर करने की जगह में बदलाव होगा
डिपेंडेंसी की वजह से रीस्टार्ट हो सकता है:
- डेटा स्टोर करने की जगह का नियम तय करने के लिए
.bzl
फ़ाइलें ज़रूरी हैं. WORKSPACE
फ़ाइल में डेटा स्टोर करने की जगह के नियम का एलान.environ
के साथ बताए गए किसी भी एनवायरमेंट वैरिएबल की वैल्यू एट्रिब्यूटrepository_rule
फ़ंक्शन का इस्तेमाल करना होगा. इन एनवायरमेंट वैरिएबल की वैल्यू को इनसे लागू किया जा सकता है कमांड लाइन,--action_env
फ़्लैग (लेकिन यह फ़्लैग बिल्ड की हर कार्रवाई को अमान्य कर देगा).- किसी लेबल का इस्तेमाल करके इस्तेमाल की गई या रेफ़र की गई किसी फ़ाइल का कॉन्टेंट (उदाहरण के लिए,
//mypkg:label.txt
,mypkg/label.txt
नहीं).
डेटा स्टोर करने की बाहरी जगहों को फिर से फ़ेच करना
कभी-कभी, कोई बाहरी डेटा स्टोर करने की जगह, अपनी फ़ाइल में कोई बदलाव किए बिना पुरानी हो सकती है
डेफ़िनिशन या डिपेंडेंसी का इस्तेमाल किया जाता है. उदाहरण के लिए, रिपॉज़िटरी का सोर्स फ़ेच करने से
किसी तीसरे पक्ष के डेटा स्टोर करने की जगह की खास ब्रांच को फ़ॉलो करने पर,
जो बैंक स्टेटमेंट में उपलब्ध है. इस स्थिति में, बेज़ल से सभी को फिर से फ़ेच करने के लिए कहा जा सकता है
डेटा स्टोर करने की जगह को बिना किसी शर्त के bazel sync
पर कॉल करके डेटा स्टोर किया जा सकता है.
इतना ही नहीं, कुछ नियम लोकल मशीन की जांच करते हैं और
अगर लोकल मशीन को अपग्रेड किया गया था, तो यह पुराना हो गया है. यहां पर आप बेज़ल को यह काम करने के लिए कह सकते हैं
सिर्फ़ उन बाहरी डेटा स्टोर करने की जगहों को फिर से लाएं जहां
repository_rule
परिभाषा में configure
एट्रिब्यूट सेट है, इसके लिए bazel sync --configure
इस्तेमाल करें.
उदाहरण
C++ अपने-आप कॉन्फ़िगर होने वाला टूलचेन: यह रिपॉज़िटरी नियम का इस्तेमाल करता है, ताकि स्थानीय C++ कंपाइलर की खोज करके, बेज़ल के लिए C++ कॉन्फ़िगरेशन फ़ाइलें देखने के लिए, और फ़्लैग, C++ कंपाइलर के साथ काम करते हैं.
डेटा स्टोर करने की जगह पर जाएं डिपेंडेंसी की सूची तय करने के लिए कई
repository_rule
का इस्तेमाल करता है Go के नियमों का इस्तेमाल करना ज़रूरी होता है.rules_jvm_external का इस्तेमाल करके बनाया गया डिफ़ॉल्ट रूप से
@maven
नाम की एक बाहरी डेटा स्टोर करने की जगह, जो बिल्ड टारगेट जनरेट करती है ट्रांज़िटिव डिपेंडेंसी ट्री में हर Maven आर्टफ़ैक्ट के लिए.