Cómo reproducir:
.
├── lib.rs
└── modname.rs
y lib.rs
con este aspecto
mod modname;
cargo build
.
├── lib.d
├── lib.rs
├── modname
│ └── mod.rs
└── modname.rs
cargo build
nuevoEn teoría, el segundo cargo build
debería comenzar a ejecutar la compilación e informar el error
error[E0584]: file for module `modname` found at both modname.rs and modname\mod.rs
pero no se inicia ninguna compilación porque Cargo cree que todo está actualizado.
Cargo usa depinfo producido por rustc
para verificar la actualización del archivo y, para este ejemplo, el depinfo producido durante la primera compilación se ve así
lib.d: lib.rs modname.rs
lib.rs:
modname.rs:
, por lo que Cargo revisa lib.rs
y modname.rs
para ver si están frescos, pero no sabe nada modname/mod.rs
.
Esto se puede solucionar emitiendo depinfo adicional - modname/mod.rs
por cada modname.rs
, y modname.rs
por cada modname/mod.rs
.
El problema es que requerirá que los sistemas de compilación (incluido Cargo) dediquen aproximadamente el doble de tiempo a verificar la frescura del archivo en las reconstrucciones de todos los proyectos, incluso si ninguno de ellos hace la locura descrita en el párrafo de reproducción.
Por lo tanto, puede ser razonable cerrar esto como WONTFIX.
El tema en sí puede ser esotérico, pero creo que es interesante como un vistazo al mundo de las estructuras de proyectos inferidas del sistema de archivos, que actualmente se discute en varias propuestas de reforma del sistema de módulos.
La solución de "abogado de idiomas" para el problema podría verse como
Si existen
modname.rs
ymodname\mod.rs
, no se especifica cuál de ellos se utilizará, se informa de un error según el mejor esfuerzo.
Comentario más útil
La solución de "abogado de idiomas" para el problema podría verse como