Ruta de tiempo de ejecución hacia el archivo de datos en repositorio externo.
Digamos que tengo dos repositorios de Bazel siguientes (repositorio git):
repos
├── data
│ ├── BUILD.bazel
│ ├── external-data.txt
│ └── WORKSPACE
└── foo
├── BUILD.bazel
├── foo.py
├── local-data.txt
└── WORKSPACE
Estoy intentando averiguar cómo el script foo.py
del repositorio foo
puede acceder a external-data.txt
del repositorio data
en tiempo de ejecución.
Hasta ahora, he configurado que el repositorio data
define un grupo de archivos públicos para external-data.txt
:
BUILD.bazel (data)
filegroup(
name = "data",
srcs = ["external-data.txt"],
visibility = ["//visibility:public"],
)
Y el repositorio foo
declara el repositorio data
como una dependencia…
WORKSPACE (foo)
local_repository(
name = "data",
path = "../data",
)
y luego hace referencia al grupo de archivos como datos que se utilizarán durante la ejecución para foo.py
:
BUILD.bazel (foo)
py_binary(
name = "foo",
srcs = ["foo.py"],
data = [
"local-data.txt",
"@data//:data"
]
)
Pero, de nuevo, no estoy seguro de qué ruta debería usar para acceder a external-data.txt
en tiempo de ejecución:
foo.py
import os
def dump_file(file_path):
print(file_path + ":")
with open(file_path) as file:
print(file.read())
def main():
data_files = [
'local-data.txt', # No hay problemas aquí
# ¿Qué ruta debo usar para acceder a @data//:external-data.txt?
]
for file in data_files:
dump_file(file)
print("cwd: " + os.getcwd())
if __name__ == "__main__":
main()
Para contextualizar, estoy usando Bazel versión 4.1.0 con la bandera --nolegacy_external_runfiles
:
bazel run //:foo --nolegacy_external_runfiles --sandbox_debug
La salida de ese comando es la siguiente:
local-data.txt:
foo
bar
baz
cwd: /home/$USER/.cache/bazel/bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/main/bazel-out/k8-fastbuild/bin/foo.runfiles/main
No estoy seguro de que sea relevante, pero cuando examino el directorio que foo.py
muestra como “cwd”, puedo encontrar el archivo external-data.txt
en esta ruta relativa:
../../../../../../../../../../../experiments/repos/data/external-data.txt
Que es la siguiente ruta absoluta:
/home/$USER/.cache/bazel/_bazel_$USER/2da14ac18a4c150d41626b6c1957d2ad/execroot/__main__/external/data
(¿Parece que en general la ruta para archivos externos debería ser algo como execroot/$WORKSPACE/external/$EXTERNAL_WORKSPACE
?)
davy.ai
Para acceder al archivo
external-data.txt
del repositoriodata
durante la ejecución enfoo.py
, debes utilizar la siguiente ruta:Esto resolverá a los archivos ejecutables del repositorio
data
, donde se encuentraexternal-data.txt
.En tu script
foo.py
, debes modificar la listadata_files
de la siguiente manera:Esto te permitirá acceder al contenido de
external-data.txt
durante la ejecución.En cuanto a la ruta para los archivos externos, como se observó, debe tener la forma
execroot/$WORKSPACE/external/$EXTERNAL_WORKSPACE
, donde$WORKSPACE
es el espacio de trabajo actual y$EXTERNAL_WORKSPACE
es el nombre del espacio de trabajo externo. En este caso, comodata
es un repositorio local, el$EXTERNAL_WORKSPACE
esdata
.