Rust工作区Crate条件构建配置:按目标编译指定Crate
Rust工作区构建配置问题
现有Rust工作区依赖结构:
bar-win-x86-x64_nightly v0.1.0 └── rand v0.8.5 ├── rand_chacha v0.3.1 │ ├── ppv-lite86 v0.2.17 │ └── rand_core v0.6.4 │ └── getrandom v0.2.9 │ └── cfg-if v1.0.0 └── rand_core v0.6.4 (*) baz-win-x86 v0.1.0 ├── bar-win-x86-x64_nightly v0.1.0 (*) └── rand v0.8.5 (*) foo-xxx v0.1.0 qux-win-x64 v0.1.0 ├── bar-win-x86-x64_nightly v0.1.0 (*) └── foo-xxx v0.1.0 wasm-unknw v0.1.0 └── foo-xxx v0.1.0
期望实现:
- 执行
cargo build --target="i686-pc-windows-msvc"时,仅构建foo-xxx(stable)、baz-win-x86(stable)、bar-win-x86-x64_nightly(nightly),同时疑问:stable crate能否依赖nightly crate? - 执行
cargo build --target="wasm32-unknown-unknown"时,仅构建foo-xxx(stable)、wasm-unknw(stable) - 执行
cargo build --target="x86_64-apple-darwin"时,仅构建foo-xxx(stable)
已尝试配置.cargo/config.toml和rust-toolchain.toml但未生效,Cargo似乎忽略了工作区中crate的规则,请问该如何配置?
疑问解答:stable crate能否依赖nightly crate?
可以,但有明确前提:
- 被依赖的nightly crate不能使用仅nightly可用的语法/不稳定特性,否则stable工具链编译会直接报错。
- 如果nightly crate本身依赖nightly专属特性,那你必须用nightly工具链编译整个依赖链,此时stable crate也会被nightly编译,完全失去使用stable的意义。因此要让stable crate正常依赖,需确保nightly crate本身能在stable工具链下编译(只是你用nightly开发该crate)。
具体配置方案
要实现按目标平台指定构建的crate,需结合工作区成员的目标过滤和工具链的针对性绑定,步骤如下:
1. 配置工作区Cargo.toml,限定各目标下的构建成员
在工作区根目录的Cargo.toml中,为每个目标平台指定允许构建的成员:
[workspace] members = [ "bar-win-x86-x64_nightly", "baz-win-x86", "foo-xxx", "qux-win-x64", "wasm-unknw", ] # 针对i686-windows目标的构建成员 [workspace.target.i686-pc-windows-msvc] members = [ "foo-xxx", "baz-win-x86", "bar-win-x86-x64_nightly", ] # 针对wasm目标的构建成员 [workspace.target.wasm32-unknown-unknown] members = [ "foo-xxx", "wasm-unknw", ] # 针对macos目标的构建成员 [workspace.target.x86_64-apple-darwin] members = [ "foo-xxx", ]
2. 绑定特定crate的工具链
在.cargo/config.toml中,为bar-win-x86-x64_nightly指定nightly工具链,其他crate默认使用stable:
[build] # 全局默认使用stable工具链 rust-version = "stable" # 为bar-win-x86-x64_nightly单独指定nightly工具链 [profile.dev.package.bar-win-x86-x64_nightly] rust-toolchain = "nightly" [profile.release.package.bar-win-x86-x64_nightly] rust-toolchain = "nightly"
也可以直接在bar-win-x86-x64_nightly的本地Cargo.toml中添加配置,让Cargo自动识别:
[package] # ...其他已有配置 rust-version = "nightly"
3. 验证配置
执行对应构建命令前,先运行cargo clean清除旧缓存,再执行命令:
cargo build --target=i686-pc-windows-msvc:仅构建foo-xxx、baz-win-x86、bar-win-x86-x64_nightlycargo build --target=wasm32-unknown-unknown:仅构建foo-xxx、wasm-unknwcargo build --target=x86_64-apple-darwin:仅构建foo-xxx
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

