Можно ли, чтобы Cargo всегда показывал предупреждения?

Я использую watch с cargo, чтобы быстро увидеть ошибки времени компиляции. Однако cargo build будет показывать только ошибки при сборке в первый раз.

$ cargo build
Compiling clayman v0.0.1
src/core_math/vector.rs:8:5: 13:6 warning: method is never used: 'New', #[warn(dead_code)] on by default
src/core_math/vector.rs:8     pub fn New(x: i32, y: i32) -> Vector {
src/core_math/vector.rs:9         Vector {
src/core_math/vector.rs:10             x: x,
src/core_math/vector.rs:11             y: y
src/core_math/vector.rs:12         }
src/core_math/vector.rs:13     }
src/core_math/vector.rs:8:5: 13:6 warning: method 'New' should have a snake case name such as 'new', #[warn(non_snake_case)] on by default
src/core_math/vector.rs:8     pub fn New(x: i32, y: i32) -> Vector {
src/core_math/vector.rs:9         Vector {
src/core_math/vector.rs:10             x: x,
src/core_math/vector.rs:11             y: y
src/core_math/vector.rs:12         }
src/core_math/vector.rs:13     }
src/main.rs:28:9: 28:10 warning: unused variable: 'v', #[warn(unused_variables)] on by default
src/main.rs:28     let v: vector::Vector;
                   ^
$ cargo build
$

Это означает, что я вижу предупреждения только в течение нескольких секунд, прежде чем watch дают мне четкий экран.

Есть ли способ сделать cargo build всегда давать мне предупреждения?

Ответ 1

Предупреждения появляются только тогда, когда Rust перекомпилирует ваши файлы; однако он кэширует как можно больше, и если что-то не изменилось, он с радостью пропустит бесполезную компиляцию. Там в настоящее время нет опции в Cargo, чтобы принудительно восстановить.

Быстрое и грязное решение, но простое в настройке, это touch исходным файлам, чтобы Cargo посчитал, что они изменились:

$ cd /path/to/project/root
$ ls
Cargo.lock Cargo.toml src        target
$ cargo build
     Compiling abc v0.1.0 (file:///private/tmp/b/abc)
  src/main.rs:2:9: 2:10 warning: unused variable: 'x', #[warn(unused_variables)] on by default
  src/main.rs:2     let x: u8 = 123;
                        ^
$ cargo build
$ touch $(find src)
$ cargo build
     Compiling abc v0.1.0 (file:///private/tmp/b/abc)
  src/main.rs:2:9: 2:10 warning: unused variable: 'x', #[warn(unused_variables)] on by default
  src/main.rs:2     let x: u8 = 123;
                        ^

Другим решением, может быть, лучше, будет очистить target каталог, содержащий двоичные артефакты, с помощью cargo clean:

$ cargo build
   Compiling abc v0.1.0 (file:///private/tmp/b/abc)
src/main.rs:2:9: 2:10 warning: unused variable: 'x', #[warn(unused_variables)] on by default
src/main.rs:2     let x: u8 = 123;
                      ^
$ cargo build
$ cargo clean
$ cargo build
   Compiling abc v0.1.0 (file:///private/tmp/b/abc)
src/main.rs:2:9: 2:10 warning: unused variable: 'x', #[warn(unused_variables)] on by default
src/main.rs:2     let x: u8 = 123;
                      ^

Преимущество Vim в том, что файл изменен! Предупреждения, а также можно запускать в любом месте внутри каталога проекта, а не только в корне.

Ответ 2

Это еще один вариант шаблона касания, описанный в ответе mdups.

Используйте эту команду для проверки ошибок типа и отображения всех предупреждений при каждом запуске, даже если не произошло никакого изменения кода:

touch src/my_tra_la_la.rs && clear && clear && cargo check

Часть clear && clear && в основном не имеет отношения к этому ответу, но для меня это обязательная часть каждой команды сборки, чтобы избежать визуального слияния нового вывода с выводом предыдущего запуска.

Это требует двух вещей, первый mod my_tra_la_la; в main.rs или в lib.rs если это библиотека.

Вторая часть необязательна, но я думаю, что было бы неплохо добавить некоторую документацию в этот специальный исходный файл, src/my_tra_la_la.rs:

//! The only purpose of this file is to act as a target for the 'touch' command
//! in order to force recompilation of this otherwise meaningless file and in
//! turn to force rustc to display warnings, every time.
//!
//! touch src/my_tra_la_la.rs && clear && clear && cargo check
//!
//! Mmm...my ding ding dong

Весь смысл выделенного сенсорного файла, подобного этому, состоит в том, чтобы избежать необходимости когда-либо открывать его в редакторе кода и избегать всплывающих окон и предупреждений, таких как "файл изменен!" пока работал.

Ответ 3

Решением, хотя и временно, было touch к файлу, который я редко редактирую. Таким образом, я избегаю проблемы, связанной с изменением this file has been changed, а также не нужно постоянно очищать весь проект.

Кроме того, мне удалось также добавить цвета (в --color опции --color), вообще не используя watch, а просто запустив следующий скрипт:

#!/bin/sh
while :
do
    script -qc "cargo build" /dev/null > .tmp
    clear
    cat .tmp
    sleep 2 # or whatever
    touch src/somefile.rs
done

Причина, по которой я пишу и читаю в .tmp заключается в том, что все выходные данные отображаются в одном (rustc данные rustc во время работы)

Ответ 4

Я сталкивался с этим раньше. Я использую:

cargo check