Как мне правильно подключить файл db.rs с помощью `mod db;` в файле lib.rs, чтобы избежать ошибки "file not found for module `db`"? Вот структура проекта:
```
Project:
src:
main.rs
lib.rs
db.rs
```
В данном случае файл db.rs содержит следующее:
```rust
mod db;
use sqlx::{Result, SqlitePool, query, query_as};
pub async fn connect_db() -> Result<SqlitePool> {
let pool = SqlitePool::connect("sqlite://passwordsx.db").await?;
Ok(pool)
}
```
А в файле lib.rs есть такой код:
```rust
use sqlx::{SqlitePool, query};
pub mod cmd {
use sqlx::{SqlitePool, query};
mod db; // ошибка
#[tauri::command]
pub fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
}
```
Уже 3 часа пытаюсь разобраться с этой ошибкой, подскажите, как ее устранить?
Кажется, у вас возникла проблема с подключением модуля `db` в вашем проекте Rust. Ошибка "file not found for module `db`" возникает, когда компилятор Rust не может найти файл, соответствующий модулю.
Давайте разберемся, как это правильно сделать.
### Структура проекта
Ваш проект имеет следующую структуру:
```
Project:
src:
main.rs
lib.rs
db.rs
```
### Как исправить ошибку
Вам нужно убедиться, что вы правильно указываете путь к модулю. В вашем случае вы хотите подключить `db.rs` внутри модуля `cmd`, который находится в `lib.rs`.
Вот правильный способ сделать это:
1. **Объявите модуль db** в файле `lib.rs` вне модуля `cmd`. Таким образом, Rust сможет найти ваш файл `db.rs` на верхнем уровне, и вы сможете его использовать.
Ваш `lib.rs` должен выглядеть так:
```rust
use sqlx::{SqlitePool, query};
pub mod cmd {
use super::*; // Используем все, что есть в родительском модуле
// Теперь подключаем db
pub mod db; // Изменено с `mod db;` на `pub mod db;`
#[tauri::command]
pub fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
}
```
2. **Измените `db.rs`**. Ваша структура файла `db.rs` может оставаться прежней, но нужно убрать строку `mod db;`, потому что это не нужно в этом контексте.
Ваш `db.rs` должен выглядеть так:
```rust
use sqlx::{Result, SqlitePool};
pub async fn connect_db() -> Result<SqlitePool> {
let pool = SqlitePool::connect("sqlite://passwordsx.db").await?;
Ok(pool)
}
```
Теперь структура проекта будет выглядеть так:
```
Project:
src:
main.rs
lib.rs
db.rs
```
### Итог
- Объявляйте модули (`pub mod db;`) на верхнем уровне в `lib.rs`.
- Убедитесь, что вы используете `use super::*;` в модуле `cmd`, если хотите использовать функции или типы из `lib.rs`.
- Убедитесь, что нет ненужного объявления `mod db;` внутри модуля `cmd`, так как вы уже подключили `db` модуль на верхнем уровне.
Теперь ваш проект должен компилироваться без ошибок, и модуль `db` станет доступен для использования в модуле `cmd`.
<blockquote>Я уже 3ч маучаюсь с этой ошибкой... </blockquote> А мог за 15 минут прочитать <a href="https://doc.rust-lang.ru/book/ch07-05-separating-modules-into-different-files.html" rel="nofollow">7 главу растбука</a> , где все разобрано.
Структура модулей в крейте с точностью повторяет структуру файлов на диске, даже если модуль объявлен внутри модуля не вынесеного в отдельный файл. <br/> То есть одно и то же объявление <code class="rust">mod db;</code> будет искать файл в разных местах, в зависимости от того, где оно написано: Но у меня большое подозрение, что Вы вообще не понимаете, как работает ключевое слово mod, ибо напихали его где только можно, включая сам db.rs (там будет искать src/db/db.rs кстати). Ключевое слово mod подключает модуль как дочерний того модуля, где оно написано. А для импорта имён нужно использовать use. <br/> <br/> И как верно подметил <a href="https://qna.habr.com/user/fenrir1121" rel="nofollow">fenrir</a> , если бы Вы внимательно прочитали растбук, то Вы бы это поняли.