रनफ़ाइल के पाथ को हार्डकोड न करें. इनमें कैननिकल रिपॉज़िटरी का नाम शामिल होता है. हालांकि, कैननिकल रिपॉज़िटरी के नाम का फ़ॉर्मैट, लागू करने से जुड़ी जानकारी है. इसमें किसी भी समय बदलाव किया जा सकता है.
इन्हें ऐक्सेस करने के लिए, भाषा के हिसाब से रनफ़ाइल लाइब्रेरी में से किसी एक का इस्तेमाल करें:
रनफ़ाइलों को आम तौर पर rlocationpath के ज़रिए इस फ़ॉर्म में रेफ़र किया जाता है: $REPO/package/file. इसमें $REPO, रिपॉज़िटरी का नाम होना चाहिए.
ज़्यादातर रनफ़ाइल लाइब्रेरी (नीचे देखें) में, फ़िलहाल एक्ज़ीक्यूट किए जा रहे टारगेट की रिपॉज़िटरी का पता लगाने की सुविधा होती है. यह सुविधा, एक ही रिपॉज़िटरी में मौजूद अन्य फ़ाइलों को रेफ़र करने के लिए काम आती है. Bazel के कई नियम, $(rlocationpath //package:target) नोटेशन का इस्तेमाल करके, टारगेट से rlocationpath में बदलने के लिए Make Variables सुविधा के साथ काम करते हैं.
उदाहरण:
C++
load("@rules_cc//cc:cc_binary.bzl", "cc_binary") cc_binary( name = "runfile", srcs = ["runfile.cc"], data = ["//examples:runfile.txt"], deps = ["@rules_cc//cc/runfiles"], )
#include#include #include #include #include "rules_cc/cc/runfiles/runfiles.h" using rules_cc::cc::runfiles::Runfiles; inline constexpr std::string_view someFile = "examples/runfile.txt"; int main(int argc, char **argv) { std::string error; const auto runfiles = Runfiles::Create(argv[0], BAZEL_CURRENT_REPOSITORY, &error); if (runfiles == nullptr) { std::cerr << "Failed to create Runfiles object" << error << "\n"; return 1; } std::string root = BAZEL_CURRENT_REPOSITORY; if (root == "") { root = "_main"; } const std::string realPathToSomeFile = runfiles->Rlocation(std::filesystem::path(root) / someFile); std::cout << "The content of the runfile is:\n"; std::ifstream fin(realPathToSomeFile); std::string line; while (std::getline(fin, line)) { std::cout << line << "\n"; } return 0; }
Golang
load("@rules_go//go:def.bzl", "go_binary") go_binary( name = "runfile", srcs = ["runfile.go"], data = ["//examples:runfile.txt"], deps = ["@rules_go//go/runfiles:go_default_library"], )
package main import ( "fmt" "log" "os" "path/filepath" "github.com/bazelbuild/rules_go/go/runfiles" ) const ( someFile = "examples/runfile.txt" ) func main() { r, err := runfiles.New() if err != nil { log.Fatalf("Failed to create Runfiles object: %v", err) } root := runfiles.CallerRepository() if root == "" { root = "_main" } path, err := r.Rlocation(filepath.Join(root, someFile)) if err != nil { log.Fatalf("Failed to find rlocation: %v", err) } fmt.Println("The content of my runfile is:") data, err := os.ReadFile(path) if err != nil { log.Fatalf("Failed to read file: %v", err) } fmt.Print(string(data)) }
Python
load("@rules_python//python:defs.bzl", "py_binary") py_binary( name = "runfile", srcs = ["runfile.py"], data = ["//examples:runfile.txt"], deps = ["@rules_python//python/runfiles"], )
import pathlib from python.runfiles import runfiles SOME_FILE = pathlib.Path('examples/runfile.txt') r = runfiles.Create() root = r.CurrentRepository() if root == "": root = "_main" realPathToSomeFile = r.Rlocation(str(root / SOME_FILE)) print("The content of the runfile is:") with open(realPathToSomeFile, 'r') as f: print(f.read())
शेल
load("@rules_shell//shell:sh_binary.bzl", "sh_binary") sh_binary( name = "runfile", srcs = ["runfile.sh"], data = ["//examples:runfile.txt"], use_bash_launcher = True, )
#!/bin/bash SOME_FILE='examples/runfile.txt' root="$(runfiles_current_repository)" if [ -z "$root" ]; then root="_main" fi real_path_to_some_file="$(rlocation "${root}/${SOME_FILE}")" echo "The content of the runfile is:" cat "${real_path_to_some_file}"