una subcarpetas ser recursivo recursividad que listar carpeta archivos testing rust rust-cargo

testing - subcarpetas - que es ser recursivo



¿Cómo hacer pruebas recursivas de todas las cajas bajo un directorio? (4)

No puedo probarlo ahora, pero creo que puedes usar cargo test --all para hacer eso.

Algunos proyectos incluyen múltiples cajas, lo que hace que sea una molestia ejecutar todas las pruebas de forma manual en cada una.

¿Hay una forma conveniente de realizar cargo test manera recursiva?


Podría usar la función de espacio de trabajo de carga. Esta colección de cajas lo usa en combinación con un Makefile , que se puede usar para compilar cada caja por sí mismo.

(La característica de espacio de trabajo ayuda a no compilar dependencias comunes varias veces)


Actualización: desde que se lanzó esta respuesta 1.15, se agregó una cargo test --all , que comparará esto con un script personalizado.

Este shell-script ejecuta pruebas recursivamente en un repositorio git para todos los directorios que contienen un archivo Cargo.toml (lo suficientemente fácil de editar para otro VCS).

  • Sale en el primer error.
  • Utiliza nocapture para que se muestre stdout
    (depende de las preferencias personales, fácil de ajustar) .
  • Ejecuta pruebas con el conjunto RUST_BACKTRACE , para obtener un resultado más útil.
  • Crea y ejecuta en dos pasos separados
    (solución para este error en 1.14 estable).
  • CARGO_BIN entorno CARGO_BIN opcional para anular el comando de carga
    (útil si desea usar un contenedor de carga como un constructor de carga fuera de la fuente ).

Guión:

#!/bin/bash # exit on first error, see: http://.com/a/185900/432509 error() { local parent_lineno="$1" local message="$2" local code="${3:-1}" if [[ -n "$message" ]] ; then echo "Error on or near line ${parent_lineno}: ${message}; exiting with status ${code}" else echo "Error on or near line ${parent_lineno}; exiting with status ${code}" fi exit "${code}" } trap ''error ${LINENO}'' ERR # done with trap # support cargo command override if [[ -z $CARGO_BIN ]]; then CARGO_BIN=cargo fi # toplevel git repo ROOT=$(git rev-parse --show-toplevel) for cargo_dir in $(find "$ROOT" -name Cargo.toml -printf ''%h/n''); do echo "Running tests in: $cargo_dir" pushd "$cargo_dir" RUST_BACKTRACE=0 $CARGO_BIN test --no-run RUST_BACKTRACE=1 $CARGO_BIN test -- --nocapture popd done

Gracias a la respuesta de @ набиячлэвэли, esta es una versión expandida.


Podría usar un script de shell. De acuerdo con esta respuesta , esto

find . -name Cargo.toml -printf ''%h/n''

Imprimirá los directorios que contienen Cargo.toml , entonces, componer esto con el resto de las utilidades de shell estándar nos rinde

for f in $(find . -name Cargo.toml -printf ''%h/n'' | sort -u); do pushd $f > /dev/null; cargo test; popd > /dev/null; done

Que iterará sobre todos los directorios que contengan Cargo.toml (una buena apuesta para los cajones) y ejecutará una cargo test en ellos.