Rust: Проблема с информацией о зависимостях для модулей, загружаемых из файлов с помощью `mod modname;`

Созданный на 6 авг. 2017  ·  1Комментарий  ·  Источник: rust-lang/rust

Как воспроизвести:

  • Создайте проект Cargo с исходным деревом, похожим на это
.
├── 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.


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

C-bug I-needs-decision T-lang

Самый полезный комментарий

Исправление проблемы "языковым юристом" могло выглядеть так:

Если существуют и modname.rs и modname\mod.rs , не указано, какой из них будет использоваться, сообщение об ошибке будет выдаваться по мере возможности.

>Все замечания

Исправление проблемы "языковым юристом" могло выглядеть так:

Если существуют и modname.rs и modname\mod.rs , не указано, какой из них будет использоваться, сообщение об ошибке будет выдаваться по мере возможности.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги