फ़ाइल फ़ोल्डर के नियम

Workspace के नियमों का इस्तेमाल, बाहरी डिपेंडेंसी को पुल करने के लिए किया जाता है. आम तौर पर, सोर्स कोड मुख्य डेटाबेस से बाहर होता है.

ध्यान दें: Bazel, नेटिव वर्कस्पेस के नियमों के अलावा, Starlark वर्कस्पेस के कई नियम भी एम्बेड करता है. खास तौर पर, वे नियम जो वेब पर होस्ट किए गए Git डेटाबेस या संग्रहों से जुड़े होते हैं.

नियम

बाइंड

नियम का सोर्स देखें
bind(name, actual, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

चेतावनी: bind() का इस्तेमाल करने का सुझाव नहीं दिया जाता है. इसकी समस्याओं और विकल्पों के बारे में ज़्यादा जानने के लिए, "बाइंड को हटाने के बारे में विचार करना" लेख पढ़ें. खास तौर पर, repo_mapping डेटाबेस एट्रिब्यूट के इस्तेमाल पर विचार करें.

चेतावनी: select() का इस्तेमाल bind() में नहीं किया जा सकता. ज़्यादा जानकारी के लिए, कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट से जुड़े अक्सर पूछे जाने वाले सवाल देखें.

इससे किसी टारगेट को //external पैकेज में कोई दूसरा नाम दिया जा सकता है.

//external पैकेज कोई "सामान्य" पैकेज नहीं है. इसमें कोई external/ डायरेक्ट्री नहीं होती. इसलिए, इसे "वर्चुअल पैकेज" माना जा सकता है, जिसमें बाइंड किए गए सभी टारगेट शामिल होते हैं.

उदाहरण

किसी टारगेट को दूसरा नाम देने के लिए, उसे WORKSPACE फ़ाइल में bind करें. उदाहरण के लिए, मान लें कि java_library नाम का टारगेट है //third_party/javacc-v2. इसे दूसरा नाम देने के लिए, WORKSPACE फ़ाइल में यह कोड जोड़ें:

bind(
    name = "javacc-latest",
    actual = "//third_party/javacc-v2",
)

अब टारगेट, //third_party/javacc-v2 के बजाय //external:javacc-latest पर निर्भर हो सकते हैं. अगर javacc-v3 रिलीज़ होता है, तो bind नियम को अपडेट किया जा सकता है. इसके बाद, //external:javacc-latest पर निर्भर सभी BUILD फ़ाइलें, बिना किसी बदलाव के javacc-v3 पर निर्भर हो जाएंगी.

बाइंड का इस्तेमाल, बाहरी डेटाबेस में मौजूद टारगेट को अपने वर्कस्पेस के लिए उपलब्ध कराने के लिए भी किया जा सकता है. उदाहरण के लिए, अगर WORKSPACE फ़ाइल में @my-ssl नाम का कोई रिमोट डेटाबेस इंपोर्ट किया गया है और उसमें //src:openssl-lib नाम का cc_library टारगेट है, तो bind का इस्तेमाल करके इस टारगेट के लिए कोई दूसरा नाम बनाया जा सकता है:

bind(
    name = "openssl",
    actual = "@my-ssl//src:openssl-lib",
)

इसके बाद, अपने वर्कस्पेस में मौजूद किसी BUILD फ़ाइल में, बाइंड किए गए टारगेट का इस्तेमाल इस तरह किया जा सकता है:

cc_library(
    name = "sign-in",
    srcs = ["sign_in.cc"],
    hdrs = ["sign_in.h"],
    deps = ["//external:openssl"],
)

sign_in.cc और sign_in.h में, //external:openssl से दिखने वाली हेडर फ़ाइलों को उनके डेटाबेस के रूट के हिसाब से पाथ का इस्तेमाल करके रेफ़र किया जा सकता है. उदाहरण के लिए, अगर @my-ssl//src:openssl-lib के लिए नियम की परिभाषा इस तरह दिखती है:

cc_library(
    name = "openssl-lib",
    srcs = ["openssl.cc"],
    hdrs = ["openssl.h"],
)

तो sign_in.cc के शामिल किए गए कॉन्टेंट इस तरह दिख सकते हैं:

#include "sign_in.h"
#include "src/openssl.h"

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

actual

लेबल; डिफ़ॉल्ट तौर पर None होता है

वह टारगेट जिसे दूसरा नाम देना है.

यह टारगेट मौजूद होना चाहिए. हालांकि, यह किसी भी तरह का नियम हो सकता है. इसमें बाइंड भी शामिल है.

अगर इस एट्रिब्यूट को छोड़ दिया जाता है, तो इस टारगेट को रेफ़र करने वाले नियमों को //external यह डिपेंडेंसी एज नहीं दिखेगी. ध्यान दें कि यह bind नियम को पूरी तरह से छोड़ने से अलग है. अगर //external डिपेंडेंसी से जुड़ा कोई bind नियम नहीं है, तो यह एक गड़बड़ी है.

local_repository

नियम का सोर्स देखें
local_repository(name, path, repo_mapping)

इससे, किसी लोकल डायरेक्ट्री में मौजूद टारगेट को बाइंड किया जा सकता है. इसका मतलब है कि मौजूदा डेटाबेस, इस दूसरी डायरेक्ट्री में तय किए गए टारगेट का इस्तेमाल कर सकता है. ज़्यादा जानकारी के लिए, बाइंड सेक्शन देखें.

उदाहरण

मान लें कि मौजूदा डेटाबेस, चैट क्लाइंट है, जो ~/chat-app डायरेक्ट्री में मौजूद है. यह ~/ssl नाम के किसी दूसरे डेटाबेस में तय की गई एसएसएल लाइब्रेरी का इस्तेमाल करना चाहता है. एसएसएल लाइब्रेरी में नाम का टारगेट //src:openssl-lib है.

उपयोगकर्ता, ~/chat-app/WORKSPACE में ये लाइनें जोड़कर, इस टारगेट पर डिपेंडेंसी जोड़ सकता है:

local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
)

टारगेट, इस लाइब्रेरी पर निर्भर होने के लिए, @my-ssl//src:openssl-lib को डिपेंडेंसी के तौर पर तय करेंगे.

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

path

स्ट्रिंग; ज़रूरी है

लोकल डेटाबेस की डायरेक्ट्री का पाथ.

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

repo_mapping

डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; डिफ़ॉल्ट तौर पर {} होती है

लोकल डेटाबेस के नाम से ग्लोबल डेटाबेस के नाम तक की डिक्शनरी. इससे इस डेटाबेस की डिपेंडेंसी के लिए, वर्कस्पेस डिपेंडेंसी रिज़ॉल्यूशन को कंट्रोल किया जा सकता है.

उदाहरण के लिए, एक एंट्री "@foo": "@bar" यह बताती है कि जब भी यह डेटाबेस "@foo" पर निर्भर करती है (जैसे कि "@foo//some:target" पर निर्भरता), तो इसे असल में, वैश्विक तौर पर घोषित "@bar" ("@bar//some:target") के अंदर उस निर्भरता को हल करना चाहिए.

new_local_repository

नियम का सोर्स देखें
new_local_repository(name, build_file, build_file_content, path, repo_mapping, workspace_file, workspace_file_content)

इससे, किसी लोकल डायरेक्ट्री को Bazel डेटाबेस में बदला जा सकता है. इसका मतलब है कि मौजूदा डेटाबेस, फ़ाइल सिस्टम में कहीं भी मौजूद टारगेट को तय और इस्तेमाल कर सकता है.

यह नियम, WORKSPACE फ़ाइल और सबडायरेक्ट्री बनाकर Bazel डेटाबेस बनाता है. इसमें, BUILD फ़ाइल और दिए गए पाथ के सिमलंक शामिल होते हैं. बिल्ड फ़ाइल को path के हिसाब से टारगेट बनाने चाहिए. जिन डायरेक्ट्री में पहले से ही WORKSPACE फ़ाइल और BUILD फ़ाइल मौजूद है उनके लिए, the local_repository नियम का इस्तेमाल किया जा सकता है.

उदाहरण

मान लें कि मौजूदा डेटाबेस, चैट क्लाइंट है, जो ~/chat-app डायरेक्ट्री में मौजूद है. यह ~/ssl नाम की किसी दूसरी डायरेक्ट्री में तय की गई एसएसएल लाइब्रेरी का इस्तेमाल करना चाहता है.

उपयोगकर्ता, एसएसएल लाइब्रेरी (~/chat-app/BUILD.my-ssl) के लिए BUILD फ़ाइल बनाकर, डिपेंडेंसी जोड़ सकता है. इसमें यह कोड शामिल होना चाहिए:

java_library(
    name = "openssl",
    srcs = glob(['*.java'])
    visibility = ["//visibility:public"],
)

इसके बाद, वे ~/chat-app/WORKSPACE में ये लाइनें जोड़ सकते हैं:

new_local_repository(
    name = "my-ssl",
    path = "/home/user/ssl",
    build_file = "BUILD.my-ssl",
)

इससे @my-ssl नाम का एक डेटाबेस बनेगा, जो /home/user/ssl से सिमलंक होगा. टारगेट की डिपेंडेंसी में @my-ssl//:openssl जोड़कर, टारगेट इस लाइब्रेरी पर निर्भर हो सकते हैं.

new_local_repository का इस्तेमाल, सिर्फ़ डायरेक्ट्री ही नहीं, बल्कि अलग-अलग फ़ाइलों को शामिल करने के लिए भी किया जा सकता है. उदाहरण के लिए, मान लें कि आपके पास /home/username/Downloads/piano.jar पर कोई जार फ़ाइल है. अपनी WORKSPACE फ़ाइल में यह कोड जोड़कर, सिर्फ़ उस फ़ाइल को अपने बिल्ड में जोड़ा जा सकता है:

new_local_repository(
    name = "piano",
    path = "/home/username/Downloads/piano.jar",
    build_file = "BUILD.piano",
)

इसके बाद, BUILD.piano नाम की यह फ़ाइल बनाएं:

java_import(
    name = "play-music",
    jars = ["piano.jar"],
    visibility = ["//visibility:public"],
)
इसके बाद, टारगेट, piano.jar का इस्तेमाल करने के लिए @piano//:play-music पर निर्भर हो सकते हैं.

तर्क

विशेषताएं
name

नाम; ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

build_file

नाम; डिफ़ॉल्ट तौर पर None होता है

इस डायरेक्ट्री के लिए, BUILD फ़ाइल के तौर पर इस्तेमाल की जाने वाली फ़ाइल.

build_file या build_file_content में से किसी एक को तय करना ज़रूरी है.

यह एट्रिब्यूट, मुख्य वर्कस्पेस के हिसाब से लेबल है. यह ज़रूरी नहीं है कि फ़ाइल का नाम BUILD हो . हालांकि, ऐसा किया जा सकता है. (जैसे, BUILD.new-repo-name का इस्तेमाल करने से, इसे डेटाबेस की असल BUILD फ़ाइलों से अलग करने में मदद मिल सकती है.)

build_file_content

स्ट्रिंग; डिफ़ॉल्ट तौर पर "" होती है

इस डेटाबेस के लिए BUILD फ़ाइल का कॉन्टेंट.

build_file या build_file_content में से किसी एक को तय करना ज़रूरी है.

path

स्ट्रिंग; ज़रूरी है

लोकल फ़ाइल सिस्टम पर कोई पाथ.

यह पाथ, मुख्य डेटाबेस की WORKSPACE फ़ाइल के हिसाब से ऐब्सलूट या रिलेटिव हो सकता है.

repo_mapping

डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; डिफ़ॉल्ट तौर पर {} होती है

लोकल डेटाबेस के नाम से ग्लोबल डेटाबेस के नाम तक की डिक्शनरी. इससे इस डेटाबेस की डिपेंडेंसी के लिए, वर्कस्पेस डिपेंडेंसी रिज़ॉल्यूशन को कंट्रोल किया जा सकता है.

उदाहरण के लिए, एक एंट्री "@foo": "@bar" यह बताती है कि जब भी यह डेटाबेस "@foo" पर निर्भर करती है (जैसे कि "@foo//some:target" पर निर्भरता), तो इसे असल में, वैश्विक तौर पर घोषित "@bar" ("@bar//some:target") के अंदर उस निर्भरता को हल करना चाहिए.

workspace_file

नाम; डिफ़ॉल्ट तौर पर None होता है

इस डेटाबेस के लिए, WORKSPACE फ़ाइल के तौर पर इस्तेमाल की जाने वाली फ़ाइल.

workspace_file या workspace_file_content में से किसी एक को तय किया जा सकता है. हालांकि, दोनों को एक साथ तय नहीं किया जा सकता.

यह एट्रिब्यूट, मुख्य वर्कस्पेस के हिसाब से लेबल है. यह ज़रूरी नहीं है कि फ़ाइल का नाम WORKSPACE हो. हालांकि, ऐसा किया जा सकता है. (जैसे, WORKSPACE.new-repo-name का इस्तेमाल करने से, इसे डेटाबेस की असल WORKSPACE फ़ाइलों से अलग करने में मदद मिल सकती है.)

workspace_file_content

स्ट्रिंग; डिफ़ॉल्ट तौर पर "" होती है

इस डेटाबेस के लिए WORKSPACE फ़ाइल का कॉन्टेंट.

workspace_file या workspace_file_content में से किसी एक को तय किया जा सकता है. हालांकि, दोनों को एक साथ तय नहीं किया जा सकता.