如何将源文件从我的库导入到 build.rs 中?

Roy*_*son 9 build-script rust rust-cargo

我有以下文件结构:

src/
    lib.rs
    foo.rs
build.rs
Run Code Online (Sandbox Code Playgroud)

我想将一些东西从foo.rs(已经lib.rspub mod foo)导入到build.rs. (我正在尝试导入类型以便在构建时生成一些 JSON 模式)

这可能吗?

She*_*ter 15

您无法干净地 \xe2\x80\x94 构建脚本用于构建库,因此根据定义必须在构建库之前运行。

\n

清洁溶液

\n

将类型放入另一个库并将新库导入到构建脚本和原始库中

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 the_library\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 the_type\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n

the_type/src/lib.rs

\n
pub struct TheCoolType;\n
Run Code Online (Sandbox Code Playgroud)\n

the_library/Cargo.toml

\n
# ...\n\n[dependencies]\nthe_type = { path = "../the_type" }\n\n[build-dependencies]\nthe_type = { path = "../the_type" }\n
Run Code Online (Sandbox Code Playgroud)\n

the_library/build.rs

\n
# ...\n\n[dependencies]\nthe_type = { path = "../the_type" }\n\n[build-dependencies]\nthe_type = { path = "../the_type" }\n
Run Code Online (Sandbox Code Playgroud)\n

the_library/src/lib.rs

\n
fn main() {\n    the_type::TheCoolType;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

黑客解决方案

\n

使用类似#[path] mod ...include!内容将代码包含两次。这基本上是纯粹的文本替换,因此非常脆弱。

\n
pub fn thing() {\n    the_type::TheCoolType;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

构建.rs

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 build.rs\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 src\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.rs\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib.rs\n
Run Code Online (Sandbox Code Playgroud)\n

src/lib.rs

\n
// One **exactly one** of this...\n#[path = "src/foo.rs"]\nmod foo;\n\n// ... or this\n// mod foo {\n//     include!("src/foo.rs");\n// }\n\nfn main() {\n    foo::TheCoolType;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

src/foo.rs

\n
mod foo;\n\npub fn thing() {\n    foo::TheCoolType;\n}\n
Run Code Online (Sandbox Code Playgroud)\n