Rust: Problema de información de dependencia para módulos cargados desde archivos con `mod modname;`

Creado en 6 ago. 2017  ·  1Comentario  ·  Fuente: rust-lang/rust

Cómo reproducir:

  • Cree un proyecto Cargo con un árbol de origen con este aspecto
.
├── lib.rs
└── modname.rs

y lib.rs con este aspecto

mod modname;
  • ejecutar cargo build
  • agregue un nuevo directorio y archivo para que el árbol de origen se convierta
.
├── lib.d
├── lib.rs
├── modname
│   └── mod.rs
└── modname.rs
  • ejecutar cargo build nuevo

En 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.

C-bug I-needs-decision T-lang

Comentario más útil

La solución de "abogado de idiomas" para el problema podría verse como

Si existen modname.rs y modname\mod.rs , no se especifica cuál de ellos se utilizará, se informa de un error según el mejor esfuerzo.

>Todos los comentarios

La solución de "abogado de idiomas" para el problema podría verse como

Si existen modname.rs y modname\mod.rs , no se especifica cuál de ellos se utilizará, se informa de un error según el mejor esfuerzo.

¿Fue útil esta página
0 / 5 - 0 calificaciones