Как рекурсивно тестировать все ящики под каталогом?

Некоторые проекты включают в себя несколько ящиков, что затрудняет выполнение всех тестов вручную в каждом.

Есть ли удобный способ рекурсивного запуска cargo test?

Ответ 1

Вы можете использовать оболочку script. В соответствии с этим ответом этот

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

Распечатайте каталоги, содержащие Cargo.toml, поэтому, составляя это с остальными стандартными утилитами оболочки, мы получаем

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

который будет перебирать все каталоги, содержащие Cargo.toml (хорошая ставка для ящиков) и запускать в них cargo test.

Ответ 2

Обновление: с момента добавления этого ответа было выпущено 1.15, добавив cargo test --all, сравнивая это с пользовательским script.


Эта оболочка script запускает тесты рекурсивно в репозитории git для всех каталогов, содержащих файл Cargo.toml (достаточно простой для редактирования для других VCS).

  • Выход из первой ошибки.
  • Использует nocapture, поэтому отображается stdout
    (зависит от личных предпочтений, легко настраивается).
  • Запускает тесты с помощью RUST_BACKTRACE set, для более полезного вывода.
  • Создает и запускается в двух отдельных шагах
    (обходной путь для эта ошибка в версии 1.14).
  • Необязательная переменная окружения CARGO_BIN для переопределения команды груза
    (удобно, если вы хотите использовать грузовую упаковку, такую ​​как load-out- из-источника-источника).

Script:

#!/bin/bash

# exit on first error, see: http://stackoverflow.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

Благодаря @набиячлэвэли ответ, это расширенная версия.

Ответ 3

Я не могу проверить это прямо сейчас, но я считаю, что вы можете использовать cargo test --all для этого.

Ответ 4

Вы можете использовать функцию рабочего пространства. Эта коллекция crate использует ее в сочетании с Makefile, которая может быть использована для компиляции каждого ящика самостоятельно.

(Функция рабочей области помогает не скомпилировать общие зависимости несколько раз)