रन फ़ाइलें

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

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

इन्हें ऐक्सेस करने के लिए, भाषा के हिसाब से रनफ़ाइल लाइब्रेरी में से किसी एक का इस्तेमाल करें:

रनफ़ाइलों को आम तौर पर 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}"