Как воспроизвести:
.
├── lib.rs
└── modname.rs
и lib.rs
выглядят так
mod modname;
cargo build
.
├── lib.d
├── lib.rs
├── modname
│ └── mod.rs
└── modname.rs
cargo build
Теоретически второй cargo build
должен запустить сборку и сообщить об ошибке.
error[E0584]: file for module `modname` found at both modname.rs and modname\mod.rs
но сборка не начинается, потому что Cargo думает, что все обновлено.
Cargo использует depinfo, созданный rustc
для проверки актуальности файла, и для этого примера depinfo, созданный во время первой сборки, выглядит следующим образом
lib.d: lib.rs modname.rs
lib.rs:
modname.rs:
, поэтому Cargo проверяет свежесть lib.rs
и modname.rs
, но ничего не знает modname/mod.rs
.
Это можно исправить, выполнив дополнительную депинфо - modname/mod.rs
для каждого modname.rs
и modname.rs
для каждого modname/mod.rs
.
Проблема в том, что системы сборки (включая Cargo) будут тратить примерно вдвое больше времени на проверку свежести файлов при перестроениях для всех проектов, даже если ни одна из них не делает безумия, описанного в параграфе воспроизведения.
Так что, возможно, будет разумно закрыть это как WONTFIX.
Сама по себе проблема может быть эзотерической, но я думаю, что она интересна как проблеск в мир структур проекта, выведенных из файловой системы, который в настоящее время обсуждается в различных предложениях по реформе модульной системы.
Исправление проблемы "языковым юристом" могло выглядеть так:
Если существуют и
modname.rs
иmodname\mod.rs
, не указано, какой из них будет использоваться, сообщение об ошибке будет выдаваться по мере возможности.
Самый полезный комментарий
Исправление проблемы "языковым юристом" могло выглядеть так: