Я начинаю изучать ржавчину и играть со структурой проекта. Теперь у меня есть такая структура проекта:
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. Что можно с этим сделать?
@kmdreko Я добавил эту информацию в вопрос.
Похоже, документация 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])
}
Этот код компилируется.
Пожалуйста, укажите ошибку
cargo check
. Он должен показать макрос-нарушитель и место его использования.