नियमों को डिप्लॉय करना

समस्या की शिकायत करें सोर्स देखें

यह पेज नियम बनाने वाले उन लोगों के लिए है जो अपने नियम अन्य लोगों को उपलब्ध कराने की योजना बना रहे हैं.

हमारा सुझाव है कि आप टेंप्लेट रिपॉज़िटरी से नया नियमसेट शुरू करें: https://github.com/bazel-conrib/rules-template यह टेंप्लेट नीचे दिए गए सुझावों को फ़ॉलो करता है. साथ ही, इसमें एपीआई से जुड़े दस्तावेज़ बनाने के साथ-साथ, CI/CD पाइपलाइन सेट अप करता है, ताकि आपके नियम-सेट को आसान बनाया जा सके.

होस्ट करने और नाम रखने के नियम

नए नियमों को आपके संगठन के तहत, अपने GitHub रिपॉज़िटरी में जाना चाहिए. अगर आपको लगता है कि आपके नियम bazelbuild संगठन से जुड़े हैं, तो GitHub पर थ्रेड शुरू करें.

Bazel के नियमों के लिए, डेटा स्टोर करने की जगहों के नाम, इस फ़ॉर्मैट के हिसाब से तय किए गए हैं: $ORGANIZATION/rules_$NAME. GitHub पर उदाहरण देखें. लगातार वीडियो अपलोड करने के लिए, आपको Bazel के नियमों को पब्लिश करते समय इसी फ़ॉर्मैट का इस्तेमाल करना चाहिए.

GitHub डेटा स्टोर करने की जगह की पूरी जानकारी और README.md टाइटल का इस्तेमाल करें. उदाहरण के लिए:

  • डेटा स्टोर करने की जगह का नाम: bazelbuild/rules_go
  • डेटा स्टोर करने की जगह की जानकारी: Bazel के लिए नियम लागू करें
  • डेटा स्टोर करने की जगह के टैग: golang, bazel
  • README.md हेडर: Bazel के लिए नियमों को लागू करें (https://bazel.build के लिंक पर ध्यान दें, जिससे उन उपयोगकर्ताओं को सही जगह पर पता मिलेगा जो Bazel से रूबरू नहीं हैं)

नियमों को भाषा (जैसे स्कैला), रनटाइम प्लैटफ़ॉर्म (जैसे कि Android) या फ़्रेमवर्क (जैसे कि स्प्रिंग) के हिसाब से ग्रुप में रखा जा सकता है.

डेटा स्टोर करने की जगह का कॉन्टेंट

नियम को स्टोर करने की हर जगह का एक खास लेआउट होना चाहिए, ताकि उपयोगकर्ता नए नियमों को तुरंत समझ सकें.

उदाहरण के लिए, (make-भरोसा गया) mockascript भाषा के लिए नए नियम लिखते समय, नियम के डेटा स्टोर करने की जगह का स्ट्रक्चर इस तरह होगा:

/
  LICENSE
  README
  WORKSPACE
  mockascript/
    constraints/
      BUILD
    runfiles/
      BUILD
      runfiles.mocs
    BUILD
    defs.bzl
  tests/
    BUILD
    some_test.sh
    another_test.py
  examples/
    BUILD
    bin.mocs
    lib.mocs
    test.mocs

Workspace

प्रोजेक्ट के WORKSPACE में, आपको वह नाम तय करना चाहिए जिसका इस्तेमाल उपयोगकर्ता आपके नियमों को रेफ़र करने के लिए करेंगे. अगर आपके नियम bazelbuild संगठन से संबंधित हैं, तो आपको rules_<lang> (जैसे कि rules_mockascript) का इस्तेमाल करना चाहिए. अगर ऐसा नहीं है, तो आपको डेटा स्टोर करने की जगह <org>_rules_<lang> (जैसे, build_stack_rules_proto) का नाम देना चाहिए. अगर आपको bazelbuild संगठन के नियमों का पालन करने की ज़रूरत है, तो कृपया GitHub पर कोई थ्रेड शुरू करें.

नीचे दिए गए सेक्शन में, मान लें कि डेटा स्टोर करने की जगह, bazelbuild संगठन की है.

workspace(name = "rules_mockascript")

README

टॉप लेवल पर, एक README होना चाहिए जिसमें (कम से कम) ऐसी चीज़ें शामिल हों जिन्हें आपके नियम का इस्तेमाल करने के लिए, उपयोगकर्ताओं को अपनी WORKSPACE फ़ाइल में कॉपी करके चिपकाना होगा. आम तौर पर, यह एक http_archive होगा जो आपकी GitHub रिलीज़ की ओर इशारा करता है. साथ ही, यह एक मैक्रो कॉल होगा जो आपके नियम के लिए ज़रूरी सभी टूल को डाउनलोड/कॉन्फ़िगर करेगा. उदाहरण के लिए, जाएं के नियमों के लिए, यह ऐसा दिखता है:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "rules_go",
    urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz"],
    sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329",
)
load("@rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
go_rules_dependencies()
go_register_toolchains()

अगर आपके नियम, डेटा स्टोर करने की किसी दूसरी जगह के नियमों पर निर्भर करते हैं, तो इसे, नियम वाले दस्तावेज़ (उदाहरण के लिए, Skydoc के नियम देखें, जो Sass के नियमों पर निर्भर करते हैं) में बताएं. साथ ही, एक WORKSPACE मैक्रो उपलब्ध कराएं, जो सभी डिपेंडेंसी डाउनलोड करेगा (ऊपर rules_go देखें).

नियम

अक्सर, डेटा स्टोर करने की जगह से कई नियम उपलब्ध होते हैं. भाषा के हिसाब से कोई डायरेक्ट्री बनाएं और एक एंट्री पॉइंट - defs.bzl फ़ाइल दें. इसमें सभी नियमों को एक्सपोर्ट किया जा सकता है (BUILD फ़ाइल भी शामिल करें, ताकि डायरेक्ट्री एक पैकेज हो). rules_mockascript के लिए, इसका मतलब है कि mockascript नाम की डायरेक्ट्री और BUILD फ़ाइल और इसमें defs.bzl फ़ाइल होगी:

/
  mockascript/
    BUILD
    defs.bzl

कंस्ट्रेंट

अगर आपका नियम टूलचेन से जुड़े नियम तय करता है, तो हो सकता है कि आपको पसंद के मुताबिक constraint_setting और/या constraint_value तय करने पड़ें. इन्हें //<LANG>/constraints पैकेज में रखें. आपकी डायरेक्ट्री स्ट्रक्चर इस तरह दिखेगा:

/
  mockascript/
    constraints/
      BUILD
    BUILD
    defs.bzl

सबसे सही तरीकों के बारे में जानने के लिए, कृपया github.com/bazelbuild/platforms पढ़ें और यह देखें कि पहले से कौन-कौनसी पाबंदियां मौजूद हैं. अगर आपकी सीमाएं अलग-अलग भाषाओं में मौजूद हैं, तो उन्हें शामिल करने के बारे में सोचें. कस्टम सीमाएं लागू करते समय ध्यान रखें कि आपके नियमों को इस्तेमाल करने वाले सभी लोग, अपनी BUILD फ़ाइलों में प्लैटफ़ॉर्म के हिसाब से कोई लॉजिक चलाने के लिए इनका इस्तेमाल करेंगे. उदाहरण के लिए, select का इस्तेमाल करना. कस्टम सीमाओं की मदद से, ऐसी भाषा तय की जाती है जिसे पूरा Bazel नेटवर्क बोलेगा.

रनफ़ाइल लाइब्रेरी

अगर आपका नियम रनफ़ाइल ऐक्सेस करने के लिए स्टैंडर्ड लाइब्रेरी उपलब्ध कराता है, तो यह //<LANG>/runfiles (//<LANG>/runfiles:runfiles का छोटा रूप) में मौजूद लाइब्रेरी टारगेट के रूप में होना चाहिए. जिन उपयोगकर्ता टारगेट को अपनी डेटा डिपेंडेंसी ऐक्सेस करना होता है वे आम तौर पर इस टारगेट को अपनी deps एट्रिब्यूट में जोड़ देंगे.

डेटा स्टोर करने के नियम

डिपेंडेंसी

आपके नियम बाहरी डिपेंडेंसी हो सकते हैं. अपने नियमों के आधार पर आसान बनाने के लिए, कृपया एक WORKSPACE मैक्रो दें, जो उन बाहरी डिपेंडेंसी पर निर्भरता का एलान करेगा. वहां टेस्ट की डिपेंडेंसी का एलान न करें, सिर्फ़ उन नियमों के बारे में बताएं जिनके लिए नियमों का काम करना ज़रूरी है. WORKSPACE फ़ाइल में डेवलपमेंट डिपेंडेंसी डालें.

<LANG>/repositories.bzl नाम की फ़ाइल बनाएं और rules_<LANG>_dependencies नाम का एक एंट्री पॉइंट मैक्रो दें. हमारी डायरेक्ट्री इस तरह दिखेगी:

/
  mockascript/
    constraints/
      BUILD
    BUILD
    defs.bzl
    repositories.bzl

टूलचेन को रजिस्टर करना

आपके नियम, टूलचेन को भी रजिस्टर कर सकते हैं. कृपया एक अलग WORKSPACE मैक्रो दें, जो इन टूलचेन को रजिस्टर करता हो. इस तरह उपयोगकर्ता, टूलचेन रजिस्टर करने के दौरान, पिछले मैक्रो को मैन्युअल तरीके से हटाने और डिपेंडेंसी को कंट्रोल करने का विकल्प चुन सकते हैं.

इसलिए, <LANG>/repositories.bzl फ़ाइल में rules_<LANG>_toolchains नाम का एक WORKSPACE मैक्रो जोड़ें.

ध्यान दें कि विश्लेषण के चरण में टूलचेन से जुड़ी समस्याओं को हल करने के लिए, Bazel को रजिस्टर किए गए सभी toolchain टारगेट का विश्लेषण करना होगा. Bazel को उन सभी टारगेट का विश्लेषण करने की ज़रूरत नहीं होगी जिनके बारे में toolchain.toolchain एट्रिब्यूट में बताया गया है. अगर टूलचेन को रजिस्टर करने के लिए, आपको रिपॉज़िटरी में कॉम्प्लेक्स कंप्यूटेशन की ज़रूरत पड़ती है, तो रिपॉज़िटरी को <LANG>_toolchain टारगेट के साथ डेटा स्टोर करने की जगह से toolchain टारगेट के साथ बांटें. पुरानी रिपोर्ट को हमेशा फ़ेच किया जाएगा और बाद वाला क्यूआर कोड सिर्फ़ तब फ़ेच किया जाएगा, जब उपयोगकर्ता को वाकई में <LANG> कोड बनाने की ज़रूरत होगी.

रिलीज़ स्निपेट

अपनी रिलीज़ के एलान में एक स्निपेट दें, जिसे आपके उपयोगकर्ता अपनी WORKSPACE फ़ाइल में कॉपी करके चिपका सकते हैं. आम तौर पर, यह स्निपेट ऐसा दिखेगा:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "rules_<LANG>",
    urls = ["<url_to_the_release.zip"],
    sha256 = "4242424242",
)
load("@rules_<LANG>//<LANG>:repositories.bzl", "rules_<LANG>_dependencies", "rules_<LANG>_toolchains")
rules_<LANG>_dependencies()
rules_<LANG>_toolchains()

जांच

ऐसे टेस्ट होने चाहिए जो इस बात की पुष्टि करते हों कि नियम उम्मीद के मुताबिक काम कर रहे हैं. यह या तो नियम वाली भाषा के लिए स्टैंडर्ड जगह हो सकता है या टॉप लेवल पर tests/ डायरेक्ट्री हो सकती है.

उदाहरण (ज़रूरी नहीं)

उपयोगकर्ताओं के लिए examples/ डायरेक्ट्री होना फ़ायदेमंद होता है. इससे उपयोगकर्ताओं को नियमों के इस्तेमाल के कुछ बुनियादी तरीकों के बारे में पता चलता है.

सीआई/सीडी

कई नियम, GitHub की कार्रवाइयों का इस्तेमाल करते हैं. नियम-टेंप्लेट रेपो में इस्तेमाल किया गया कॉन्फ़िगरेशन देखें. इसे bazel-conrib संगठन में होस्ट किए गए "फिर से इस्तेमाल किए जा सकने वाले वर्कफ़्लो" का इस्तेमाल करके आसान बनाया गया है. ci.yaml हर PR और main कॉमिट पर टेस्ट करता है. साथ ही, जब भी किसी टैग को रिपॉज़िटरी (डेटा स्टोर करने की जगह) में पुश किया जाता है, तब release.yaml चलता है. ज़्यादा जानकारी के लिए, नियमों के टेंप्लेट रेपो में टिप्पणियां देखें.

अगर आपका डेटा स्टोर करने की जगह, bazelbuild संगठन में शामिल है, तो उसे ci.bazel.build में जोड़ने के लिए अनुरोध किया जा सकता है.

दस्तावेज़

अपने नियमों पर टिप्पणी करने के तरीके से जुड़े निर्देशों के लिए, Stardoc का दस्तावेज़ देखें, ताकि दस्तावेज़ अपने-आप जनरेट हो सकें.

नियम-टेंप्लेट दस्तावेज़/ फ़ोल्डर यह पक्का करने का एक आसान तरीका दिखाता है कि docs/ फ़ोल्डर में Markdown कॉन्टेंट हमेशा अप-टू-डेट रहे, क्योंकि Starlark फ़ाइलें अपडेट होती हैं.

अक्सर पूछे जाने वाले सवाल

हम अपना नियम, Bazel GitHub के मुख्य डेटा स्टोर करने की जगह में क्यों नहीं जोड़ सकते?

हम ज़्यादा से ज़्यादा, Bazel रिलीज़ से नियमों को अलग करना चाहते हैं. इससे साफ़ तौर पर पता चलता है कि अलग-अलग नियमों का मालिक कौन है. इससे Bazel डेवलपर पर लोडिंग घटती है. हमारे उपयोगकर्ताओं के लिए, डिकप करने की सुविधा से नियमों को बदलना, अपग्रेड करना, डाउनग्रेड करना, और बदलना आसान हो जाता है. नियमों में योगदान करना, Bazel में योगदान देने के मुकाबले हल्का हो सकता है. यह नियमों पर निर्भर करता है. इसमें, इससे जुड़े GitHub डेटा स्टोर करने की जगह के लिए सबमिट करने का पूरा ऐक्सेस भी शामिल है. Bazel के लिए सबमिट का ऐक्सेस पाना, अपने-आप में बहुत ज़्यादा प्रोसेस होता है.

समस्या यह है कि हमारे उपयोगकर्ताओं के लिए, इंस्टॉल करने की प्रक्रिया एक बार मुश्किल होती है. उन्हें एक नियम कॉपी करके, अपनी WORKSPACE फ़ाइल में चिपकाना होगा, जैसा कि ऊपर README.md सेक्शन में दिखाया गया है.

हमारे पास सभी नियम Bazel डेटा के संग्रह में (//tools/build_rules या //tools/build_defs के तहत) हुआ करते थे. अब भी हमारे कुछ नियम हैं, लेकिन हम बाकी के नियमों को हटाने की कोशिश कर रहे हैं.