執行檔

執行階段檔案是目標在執行階段 (而非建構階段) 使用的一組檔案

請勿以硬式編碼方式設定 runfiles 路徑。這些名稱包含標準存放區名稱,但標準存放區名稱格式是實作詳細資料,隨時可能變更

使用其中一個語言專屬的執行檔程式庫存取這些檔案:

一般來說,Runfile 會以 rlocationpath 的形式參照,其中 $REPO 應為顯而易見的存放區名稱$REPO/package/file大多數 runfiles 程式庫 (見下文) 支援判斷目前執行目標的存放區,這有助於參照同一存放區中的其他檔案。許多 Bazel 規則都支援 Make 變數,可使用 $(rlocationpath //package:target) 標記從目標轉換為 rlocationpath。

範例:

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