Args

Informa un problema Ver la fuente

Un objeto que encapsula de manera eficiente la memoria los datos necesarios para compilar una parte o la totalidad de una línea de comandos.

A menudo, una acción requiere una línea de comandos grande que contenga valores acumulados de las dependencias transitivas. Por ejemplo, una línea de comandos del vinculador podría enumerar cada archivo de objeto que necesitan todas las bibliotecas vinculadas. Se recomienda almacenar esos datos transitivos en depset, de modo que se puedan compartir entre varios destinos. Sin embargo, si el autor de la regla debe convertir estos grupos de objetos en listas de strings para construir una línea de comandos de acción, se derrotará esta optimización del uso compartido de la memoria.

Por este motivo, las funciones de construcción de acciones aceptan objetos Args además de strings. Cada objeto Args representa una concatenación de strings y dependencias, con transformaciones opcionales para manipular datos. Los objetos Args no procesan los dispositivos que encapsulan hasta la fase de ejecución, cuando es momento de calcular la línea de comandos. Esto permite posponer cualquier copia costosa hasta que se complete la fase de análisis. Consulta la página Cómo optimizar el rendimiento para obtener más información.

Para construir Args, se debe llamar a ctx.actions.args(). Se pueden pasar como el parámetro arguments de ctx.actions.run() o ctx.actions.run_shell(). Cada mutación de un objeto Args agrega valores a la línea de comandos final.

La función map_each te permite personalizar la manera en que se transforman los elementos en strings. Si no proporcionas una función map_each, la conversión estándar es la siguiente:

  • Los valores que ya son strings se dejan tal como están.
  • Los objetos File se convierten en sus valores File.path.
  • Todos los demás tipos se convierten en strings de una manera sin especificar. Por este motivo, debes evitar pasar valores que no sean de tipo string o File a add() y, si los pasas a add_all() o add_joined(), debes proporcionar una función map_each.

Cuando se usa el formato de strings (parámetros format, format_each y format_joined de los métodos add*()), la plantilla de formato se interpreta de la misma manera que la sustitución % en las strings, excepto que la plantilla debe tener exactamente un marcador de posición de sustitución y debe ser %s. Los porcentajes literales pueden tener el formato de escape %%. El formato se aplica después de que el valor se convierte en una string, según lo anterior.

Cada uno de los métodos add*() tiene una forma alternativa que acepta un parámetro posicional adicional, una string de "nombre del argumento" para insertar antes del resto de los argumentos. Para add_all y add_joined, no se agregará la string adicional si la secuencia está vacía. Por ejemplo, el mismo uso puede agregar --foo val1 val2 val3 --bar o solo --bar a la línea de comandos, según si la secuencia determinada contiene val1..val3 o está vacía.

Si el tamaño de la línea de comandos puede crecer más que el tamaño máximo que permite el sistema, los argumentos se pueden desbordar en los archivos de parámetros. Consulta use_param_file() y set_param_file_format().

Ejemplo: Supongamos que queremos generar la línea de comandos:

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
Podríamos usar el siguiente objeto Args:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

Miembros

en Agregar

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

Agrega un argumento a esta línea de comandos.

Parámetros

Parámetro Descripción
arg_name_or_value obligatorio
Si se pasan dos parámetros posicionales, esto se interpreta como el nombre del argumento. El nombre de arg se agrega antes del valor sin ningún procesamiento. Si solo se pasa un parámetro posicional, se interpreta como value (consulta a continuación).
value default = unbound
Es el objeto que se agregará. Se convertirá en una string mediante la conversión estándar mencionada anteriormente. Como no hay un parámetro map_each para esta función, value debe ser una string o un File. Se debe pasar una lista, una tupla, una implementación o un directorio File a add_all() o add_joined() en lugar de este método.
format string; or None; default = None
Un patrón de string de formato que se aplica a la versión en string de value.

agregar_todos

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

Agrega varios argumentos a esta línea de comandos. Los elementos se procesan de forma diferida durante la fase de ejecución.

La mayor parte del procesamiento se lleva a cabo en una lista de argumentos que se deben agregar, de acuerdo con los siguientes pasos:

  1. Cada elemento File del directorio se reemplaza por todos los File que se incluyen de forma recurrente en ese directorio.
  2. Si se proporciona un map_each, se aplica a cada elemento y las listas de strings resultantes se concatenan para formar la lista de argumentos inicial. De lo contrario, la lista de argumentos inicial es el resultado de aplicar la conversión estándar a cada elemento.
  3. Cada argumento de la lista tiene el formato format_each, si está presente.
  4. Si uniquify es verdadero, se quitan los argumentos duplicados. El primero es el que queda.
  5. Si se proporciona una string before_each, se inserta como un argumento nuevo antes de cada argumento existente de la lista. Esto duplica la cantidad de argumentos que se agregan en este punto.
  6. Excepto que la lista esté vacía y omit_if_empty sea verdadero (el predeterminado), el nombre del argumento y terminate_with se insertan como el primer y el último argumento, respectivamente, si se proporcionan.
Ten en cuenta que las strings vacías son argumentos válidos que están sujetos a todos estos pasos de procesamiento.

Parámetros

Parámetro Descripción
arg_name_or_values obligatorio
Si se pasan dos parámetros posicionales, esto se interpreta como el nombre del argumento. El nombre del argumento se agrega antes del values como un argumento independiente sin ningún procesamiento. Este nombre de argumento no se agregará si omit_if_empty es verdadero (predeterminado) y no se agregan otros elementos (como sucede si values está vacío o se filtran todos sus elementos). Si solo se pasa un parámetro posicional, se interpreta como values (consulta a continuación).
values sequence; or depset; default = unbound
La lista, tupla o depset cuyos elementos se agregarán.
map_each callable; or None; default = None
Una función que convierte cada elemento en cero o más strings, que se puede procesar antes de agregar Si no se proporciona este parámetro, se utiliza la conversión estándar.

A la función se le pasa uno o dos argumentos posicionales: el elemento que se va a convertir, seguido de un DirectoryExpander opcional. El segundo argumento se pasará solo si la función proporcionada está definida por el usuario (no integrada) y declara más de un parámetro.

El tipo del valor que se muestra depende de la cantidad de argumentos que se generarán para el elemento:

  • En el caso común cuando cada elemento se convierte en una string, la función debe mostrar esa string.
  • Si el elemento se filtra por completo, la función debe mostrar None.
  • Si el elemento se convierte en varias strings, la función muestra una lista de esas strings.
Mostrar una sola string o None tiene el mismo efecto que mostrar una lista de longitud 1 o longitud 0, respectivamente. Sin embargo, es más eficiente y legible para evitar crear una lista cuando no la necesite.

Por lo general, los elementos que son directorios se expanden automáticamente a su contenido cuando se configura expand_directories=True. Sin embargo, esto no expandirá los directorios dentro de otros valores, por ejemplo, cuando los elementos sean structs que tengan directorios como campos. En este caso, el argumento DirectoryExpander se puede aplicar para obtener manualmente los archivos de un directorio determinado.

Para evitar la retención no deseada de grandes estructuras de datos en fases de análisis en la fase de ejecución, la función map_each debe declararse mediante una sentencia def de nivel superior. Es posible que no sea un cierre de función anidada de forma predeterminada.

Advertencia: Las sentencias print() que se ejecutan durante la llamada a map_each no producirán ningún resultado visible.

format_each string; or None; default = None
Un patrón de string de formato opcional, que se aplica a cada string que muestra la función map_each. La string de formato debe tener exactamente un marcador de posición "%s".
before_each string; or None; default = None
Se adjunta un argumento opcional para agregar antes de cada argumento derivado de values.
omit_if_empty default = True
Si es verdadero, si no hay argumentos derivados de values que se vayan a agregar, se borrará todo el procesamiento y no se modificará la línea de comandos. Si es falso, el nombre del argumento y terminate_with, si se proporcionan, se agregarán sin importar si hay otros argumentos o no.
uniquify default = False
Si es verdadero, se omitirán los argumentos duplicados derivados de values. Solo se mantendrá el primer caso de cada argumento. Por lo general, esta función no es necesaria porque los valores de Depset ya omiten los duplicados, pero pueden ser útiles si map_each emite la misma string para varios elementos.
expand_directories default = True
Si es verdadero, cualquier directorio en values se expandirá a una lista plana de archivos. Esto ocurre antes de que se aplique map_each.
terminate_with string; or None; default = None
Un argumento opcional para agregar después de todos los otros argumentos. Este argumento no se agregará si omit_if_empty es verdadero (predeterminado) y no se agregan otros elementos (como sucede si values está vacío o se filtran todos sus elementos).
allow_closure default = False
Si es verdadero, permite el uso de cierres en parámetros de funciones como map_each. Por lo general, esto no es necesario y corre el riesgo de retener grandes estructuras de datos de fases de análisis en la fase de ejecución.

agregar_unido

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

Agrega un argumento a esta línea de comandos mediante la concatenación de varios valores con un separador. Los elementos se procesan de forma diferida durante la fase de ejecución.

El procesamiento es similar a add_all(), pero la lista de argumentos derivados de values se combina en un solo argumento como si fuera join_with.join(...) y, luego, se formatea con la plantilla de string format_joined determinada. A diferencia de add_all(), no hay un parámetro before_each o terminate_with, ya que, por lo general, no son útiles cuando los elementos se combinan en un solo argumento.

Si, después de filtrar, no hay strings para unir en un argumento y si omit_if_empty es verdadero (predeterminado), no se realiza ningún procesamiento. De lo contrario, si no hay strings para unir, pero omit_if_empty es falso, la string unida será una string vacía.

Parámetros

Parámetro Descripción
arg_name_or_values obligatorio
Si se pasan dos parámetros posicionales, esto se interpreta como el nombre del argumento. El nombre del argumento se agrega antes de values sin ningún procesamiento. Este argumento no se agregará si omit_if_empty es verdadero (predeterminado) y no hay strings derivadas de values para unirse (lo que puede suceder si values está vacío o se filtran todos sus elementos). Si solo se pasa un parámetro posicional, se interpreta como values (consulta a continuación).
values sequence; or depset; default = unbound
La lista, tupla o depset cuyos elementos se unirán.
join_with obligatorio
Una string delimitadora que se usa para unir las strings obtenidas de la aplicación de map_each y format_each, de la misma manera que string.join().
map_each callable; or None; default = None
Igual que para add_all.
format_each string; or None; default = None
Igual que para add_all.
format_joined string; or None; default = None
Un patrón de string de formato opcional aplicado a la string unida. La string de formato debe tener exactamente un marcador de posición "%s".
omit_if_empty default = True
Si es verdadero, si no hay strings para unir (ya sea porque values está vacío o todos sus elementos están filtrados), se borrará todo el procesamiento y se modificará la línea de comandos. Si es falso, entonces incluso si no hay strings para unir, se agregarán dos argumentos: el nombre del argumento seguido de una string vacía (que es la unión lógica de cero strings).
uniquify default = False
Igual que add_all.
expand_directories default = True
Igual que add_all.
allow_closure default = False
Igual que add_all.

set_param_file_format

Args Args.set_param_file_format(format)

Establece el formato del archivo de parámetros, si se usa.

Parámetros

Parámetro Descripción
format obligatorio:
Debe ser uno de los siguientes:
  • "multiline": Cada elemento (nombre o valor del argumento) se escribe textualmente en el archivo de parámetros con un carácter de salto de línea que lo sigue.
  • "shell": Es igual a "multiline", pero los elementos están entrecomillados
  • "flag_per_line": al igual que "multiline", pero (1) solo se escriben las marcas (que comienzan con "--") en el archivo de parámetros y (2) los valores de las marcas, si las hay, se escriben en la misma línea con un separador "=". Este es el formato que espera la biblioteca de marcas Abseil.

Si no se llama, el formato predeterminado es "shell".

use_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

Derrama los argumentos en un archivo de parámetros y los reemplaza por un puntero para el archivo de parámetros. Úsalo cuando tus argumentos puedan ser demasiado grandes para los límites de longitud del comando del sistema.

Para mayor eficiencia, Bazel puede elegir escribir el archivo de parámetros en el árbol de resultados durante la ejecución. Si depuras acciones y quieres inspeccionar el archivo de parámetros, pasa --materialize_param_files a tu compilación.

Parámetros

Parámetro Descripción
param_file_arg obligatorio
Una string de formato con un solo “%s”. Si los args se derraman en un archivo de parámetros, se reemplazan por un argumento que consta de esta string con el formato de la ruta del archivo de parámetros.

Por ejemplo, si los args se derraman en un archivo de parámetros "params.txt", la especificación de "--file=%s" haría que la línea de comandos de la acción contenga "--file=params.txt".

use_always default = False
Indica si siempre se deben derramar los argumentos en un archivo de parámetros. Si es falso, Bazel decidirá si los argumentos se deben desbordar según tu sistema y la longitud del argumento.