Неудачная компиляция Rust-проекта с кастомной структурой и использованием макросов

Я начинаю изучать ржавчину и играть со структурой проекта. Теперь у меня есть такая структура проекта:

project
└─── src
│   └─── core
│   │   └─── lib.rs
│   │   └─── Cargo.toml
│   └─── api
│       └─── main.rs
│       └─── Cargo.toml
└─── Cargo.toml

Содержимое файлов toml следующее:
project/Cargo.toml

[workspace]
members = [ 
    "src/core", 
    "src/api"
]

project/src/api/Cargo.toml

[package]
name = "api"
version = "0.1.0"

[[bin]]
name = "api"
path = "main.rs"

[dependencies]
core = { path = "../core" }
rocket =  { version = "0.5.0", features = ["json"] } 

С такими настройками проект не компилируется, если в main.rs я пытаюсь работать с макросами ракеты. main.rs (код взят из описания ракетного пакета):

#[macro_use] extern crate rocket;

#[get("/<name>/<age>")]
fn hello(name: &str, age: u8) -> String {
    format!("Hello, {} year old named {}!", age, name)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/hello", routes![hello])
}

Я получаю сообщение об ошибке:

error: macro-expanded `macro_export` macros from the current crate cannot be referred to by absolute paths
 --> src\api\main.rs:4:4
  |
4 | fn hello(name: &str, age: u8) -> String {
  |    ^^^^^
  |
  = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
  = note: for more information, see issue #52234 <https://github.com/rust-lang/rust/issues/52234>     
note: the macro is defined here
 --> src\api\main.rs:3:1
  |
3 | #[get("/<name>/<age>")]
  | ^^^^^^^^^^^^^^^^^^^^^^^
  = note: `#[deny(macro_expanded_macro_exports_accessed_by_absolute_paths)]` on by default
  = note: this error originates in the attribute macro `get` (in Nightly builds, run with -Z macro-backtrace for more info)

error: could not compile `api` (bin "api") due to 1 previous error

В чем причина этого и как это можно исправить?

Но

Пробовал создать проект api с папкой src, проблема не повторяется.

api
└─── src
│   └─── main.rs
└─── Cargo.toml

Но я не хочу сохранять папки src для каждого проекта (основного и lib), поскольку в рабочей области уже есть src. Что можно с этим сделать?

Пожалуйста, укажите ошибку cargo check. Он должен показать макрос-нарушитель и место его использования.

kmdreko 04.05.2024 22:28

@kmdreko Я добавил эту информацию в вопрос.

student0011001 05.05.2024 10:14
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, документация Rocket давно не обновлялась, потому что синтаксис #[macro_use] был прекращен в Rust 1.30. Просто импортируйте эти макросы через объявление использования следующим образом:

use rocket::{get, launch, routes};

#[get("/<name>/<age>")]
fn hello(name: &str, age: u8) -> String {
    format!("Hello, {} year old named {}!", age, name)
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/hello", routes![hello])
}

Этот код компилируется.

Другие вопросы по теме