Bazel acepta muchas opciones. Algunas opciones se varían con frecuencia (por ejemplo, --subcommands
), mientras que otras permanecen iguales en varias compilaciones (como --package_path
). A fin de evitar especificar estas opciones sin cambios para cada compilación (y otros comandos), puedes especificar opciones en un archivo de configuración denominado .bazelrc
.
¿Dónde están los archivos .bazelrc
?
Bazel busca archivos de configuración opcionales en las siguientes ubicaciones,
en el orden que se muestra a continuación. Las opciones se interpretan en este orden, por lo que las opciones de los archivos posteriores pueden anular un valor de un archivo anterior si surge un conflicto. Todas las opciones que controlan cuáles de estos archivos se cargan son opciones de inicio, lo que significa que deben ocurrir después de bazel
y antes del comando (build
, test
, etc.).
El archivo RC del sistema, a menos que esté presente
--nosystem_rc
.Ruta:
- En Linux, macOS y Unix:
/etc/bazel.bazelrc
- En Windows:
%ProgramData%\bazel.bazelrc
No es un error si este archivo no existe.
Si se requiere otra ubicación especificada por el sistema, debes compilar un objeto binario de Bazel personalizado y anular el valor de
BAZEL_SYSTEM_BAZELRC_PATH
en//src/main/cpp:option_processor
. La ubicación especificada por el sistema puede contener referencias de variables de entorno, como${VAR_NAME}
en Unix o%VAR_NAME%
en Windows.- En Linux, macOS y Unix:
El archivo del RC del lugar de trabajo, a menos que esté presente
--noworkspace_rc
Ruta de acceso:
.bazelrc
en el directorio de tu lugar de trabajo (junto al archivoWORKSPACE
principal).No es un error si este archivo no existe.
El archivo RC doméstico, a menos que esté presente
--nohome_rc
Ruta:
- En Linux, macOS y Unix:
$HOME/.bazelrc
- En Windows:
%USERPROFILE%\.bazelrc
si existe, o%HOME%/.bazelrc
No es un error si este archivo no existe.
- En Linux, macOS y Unix:
El archivo RC especificado por el usuario, si se especifica con
--bazelrc=file
Esta marca es opcional, pero también se puede especificar varias veces.
/dev/null
indica que se ignorarán todos los demás--bazelrc
, lo que es útil para inhabilitar la búsqueda de un archivo rc de usuario, como en las compilaciones de lanzamiento.Por ejemplo:
--bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
- Se leyeron
x.rc
yy.rc
. z.rc
se ignora debido a la/dev/null
anterior.
- Se leyeron
Además de este archivo de configuración opcional, Bazel busca un archivo rc global. Para obtener más información, consulta la sección global de Bazelrc.
Semántica y semántica de .bazelrc
Al igual que todos los archivos “rc” de UNIX, el archivo .bazelrc
es un archivo de texto con una gramática basada en líneas. Se ignoran las líneas vacías y las líneas que comienzan con #
(comentarios). Cada línea contiene una secuencia de palabras a las que se les asignan tokens de acuerdo con las mismas reglas que el shell de Bourne.
Importaciones
Las líneas que comienzan con import
o try-import
son especiales: úsalas para cargar otros archivos "rc". Para especificar una ruta relativa a la raíz del lugar de trabajo, escribe import %workspace%/path/to/bazelrc
.
La diferencia entre import
y try-import
es que Bazel falla si falta el
archivo con el valor import
(o no se puede leer), pero no con un archivo try-import
.
Prioridad de importación:
- Las opciones del archivo importado tienen prioridad sobre las opciones especificadas antes de la sentencia de importación.
- Las opciones especificadas después de la sentencia de importación tienen prioridad sobre las del archivo importado.
- Las opciones de los archivos que se importan más adelante tienen prioridad sobre las que se importaron antes.
Valores predeterminados de opciones
La mayoría de las líneas de un bazelrc definen valores de opciones predeterminados. La primera palabra de cada línea especifica cuándo se aplican estos valores predeterminados:
startup
: Son las opciones de inicio, que van antes del comando, y se describen enbazel help startup_options
.common
: Son las opciones que se deben aplicar a todos los comandos de Bazel que las admitan. Si un comando no admite una opción especificada de esta manera, la opción se ignora, siempre que sea válida para algunos comandos de Bazel. Ten en cuenta que esto solo se aplica a los nombres de opciones. Si el comando actual acepta una opción con el nombre especificado, pero no admite el valor especificado, fallará.always
: Son opciones que se aplican a todos los comandos de Bazel. Si un comando no admite una opción especificada de esta manera, fallará.command
: Comando de Bazel, comobuild
oquery
, al que se aplican las opciones Estas opciones también se aplican a todos los comandos que heredan del comando especificado. (por ejemplo,test
se hereda debuild
).
Cada una de estas líneas se puede usar más de una vez y los argumentos que siguen a la primera palabra se combinan como si hubieran aparecido en una sola línea. (Los usuarios de CVS, otra herramienta que tiene la interfaz de línea de comandos "navaja suiza", encontrarán la sintaxis similar a la de .cvsrc
). Por ejemplo, las líneas son las siguientes:
build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar
se combinan de la siguiente manera:
build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar
por lo que las marcas eficaces son --verbose_failures
y --test_tmpdir=/tmp/bar
.
Precedencia de opciones:
- Las opciones de la línea de comandos siempre tienen prioridad sobre las de los archivos rc.
Por ejemplo, si un archivo rc dice
build -c opt
, pero la marca de la línea de comandos es-c dbg
, prevalece la marca de la línea de comandos. Dentro del archivo rc, la precedencia se rige por la especificidad: las líneas de un comando más específico tienen prioridad sobre las líneas de un comando menos específico.
La especificidad se define por herencia. Algunos comandos heredan opciones de otros comandos, lo que hace que el comando heredado sea más específico que el comando base. Por ejemplo,
test
hereda del comandobuild
, por lo que todas las marcas debazel build
son válidas parabazel test
, y todas las líneas debuild
también se aplican abazel test
, a menos que haya una línea detest
para la misma opción. Si el archivo rc dice:test -c dbg --test_env=PATH
build -c opt --verbose_failures
bazel build //foo
usará-c opt --verbose_failures
ybazel test //foo
usará--verbose_failures -c dbg --test_env=PATH
.El gráfico de herencia (especificidad) es el siguiente:
- Todos los comandos se heredan de
common
- Los siguientes comandos heredan (y son más específicos que)
build
:test
,run
,clean
,mobile-install
,info
,print_action
,config
,cquery
yaquery
. coverage
hereda detest
- Todos los comandos se heredan de
Dos líneas que especifican opciones para el mismo comando con la misma especificidad se analizan en el orden en el que aparecen dentro del archivo.
Debido a que esta regla de precedencia no coincide con el orden del archivo, facilita la lectura si sigues el orden de prioridad dentro de los archivos rc: comienza con las opciones
common
en la parte superior y termina con los comandos más específicos en la parte inferior del archivo. De esta manera, el orden en el que se leen las opciones es el mismo en el que se aplican, lo que es más intuitivo.
Los argumentos especificados en una línea de un archivo rc pueden incluir argumentos que no son opciones, como los nombres de los destinos de compilación, etcétera. Estas, como las opciones especificadas en los mismos archivos, tienen menor prioridad que sus elementos del mismo nivel en la línea de comandos y siempre se agregan a la lista explícita de argumentos que no son de opción.
--config
Además de establecer los valores predeterminados de las opciones, el archivo rc se puede usar para agrupar opciones y proporcionar una abreviatura de agrupaciones comunes. Para ello, agrega un sufijo :name
al comando. Estas opciones se ignoran de forma predeterminada, pero se incluirán cuando la opción --config=name
esté presente, ya sea en la línea de comandos o en un archivo .bazelrc
, de forma recurrente, incluso dentro de otra definición de configuración. Las opciones que especifica command:name
solo se expandirán para los comandos aplicables, en el orden de precedencia que se describió antes.
--config=foo
se expande a las opciones definidas en los archivos rc "in situ" a fin de que las opciones especificadas para la configuración tengan la misma prioridad que la opción --config=foo
.
Esta sintaxis no se extiende al uso de startup
para establecer opciones de inicio. Se ignorará
la configuración de startup:config-name --some_startup_option
en .bazelrc.
Ejemplo
Este es un archivo ~/.bazelrc
de ejemplo:
# Bob's Bazel option defaults
startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going
# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600
Otros archivos que rigen el comportamiento de Bazel
.bazelignore
Puedes especificar directorios dentro del lugar de trabajo
que quieras que Bazel ignore, como proyectos
relacionados que usan otros sistemas de compilación. Coloca un archivo llamado
.bazelignore
en la raíz del lugar de trabajo
y agrega los directorios que deseas que Bazel ignore, uno por
línea. Las entradas están relacionadas con la raíz del lugar de trabajo.
El archivo global de bazelrc
Bazel lee archivos bazelrc opcionales en este orden:
- El archivo rc del sistema se encuentra en
etc/bazel.bazelrc
. - Archivo rc de Workspace ubicado en
$workspace/tools/bazel.rc
. - Archivo rc principal ubicado en
$HOME/.bazelrc
Cada archivo de bazelrc que se enumera aquí tiene una marca correspondiente que se puede usar para
inhabilitarlas (p.ej., --nosystem_rc
, --noworkspace_rc
, --nohome_rc
). También puedes
hacer que Bazel ignore todos los bazelrcs si pasas la opción de inicio
--ignore_all_rc_files
.