เรียกใช้ไฟล์

Runfiles คือชุดไฟล์ที่เป้าหมายใช้ในขณะรันไทม์ (เทียบกับเวลาบิลด์)

อย่าฮาร์ดโค้ดเส้นทางไฟล์ที่เรียกใช้ ซึ่งมีชื่อที่เก็บมาตรฐาน แต่รูปแบบชื่อที่เก็บมาตรฐานเป็นรายละเอียดการติดตั้งใช้งานที่อาจเปลี่ยนแปลงได้ทุกเมื่อ

ใช้ไลบรารีไฟล์ที่เรียกใช้เฉพาะภาษาเพื่อเข้าถึงไฟล์เหล่านั้น

โดยทั่วไปแล้วจะอ้างอิงไฟล์ที่สร้างขึ้นโดยใช้ rlocationpath ในรูปแบบ $REPO/package/file โดยที่ $REPO ควรเป็น ชื่อที่เก็บที่ชัดเจน ไลบรารีไฟล์ที่เรียกใช้ส่วนใหญ่ (ดูด้านล่าง) รองรับฟังก์ชันการทำงานในการกำหนดที่เก็บของเป้าหมายที่ดำเนินการอยู่ในปัจจุบัน ซึ่งมีประโยชน์ในการอ้างอิงไฟล์อื่นๆ ในที่เก็บเดียวกัน กฎ Bazel หลายข้อรองรับตัวแปร Make เพื่อแปลจากเป้าหมายเป็น rlocationpath โดยใช้สัญกรณ์ $(rlocationpath //package:target)

ตัวอย่าง

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}"