查询说是可以通过CARGO_CFG_TEST环境变量来区分, 但是我在build.rs里加入该打印后:
println!("env: {:?}", env::var("CARGO_CFG_TEST"));
在target/debug/build/xxx/output里查看到的结果是:
env: Err(NotPresent)
请各位指导下,应该如何处理?我需要在build.rs的编译配置test和正式版本不一样。
1
共 3 条评论, 1 页
评论区
写评论有些内置于 rustc 或者 cargo 的编译选项是特殊的,虽然最终都在控制条件编译,但 cargo 在不同场景下对这些编译选项的支持方式并不一样。这些都以 cargo 的文档为准 —— 因为你现在在问 build.rs,它属于 cargo 而不属于 rustc。
P.S.
#[cfg(test)]
属于 cargo 的 test harness 部分,而#[test]
属于 rustc 的 --test 部分(rustc --print=cfg 的结果并不包含 test)。P.S.2
feature
属于 cargo 条件编译test本身不就是编译选项吗?我查询说是test时 会把CARGO_CFG_TEST设置为true, 但是实际测试没有,感觉很奇怪。
--
👇
苦瓜小仔:
println!("env: {:?}", env::var("CARGO_CFG_TEST"));
的意思是通过 cfg flags 控制条件编译,在 build.rs 通过CARGO_CFG_*
感知。文档:https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts
比如,你的测试是条件编译控制的:
然后传递 cfg flags 就行了:
这会涉及一些条件编译的细节,不限于:
-vvv
可以打印完整的 build 阶段的输出(包括 build.rs,不过由于缓存,不是每次都会打印):RUSTFLAGS='--cfg=my_test_flag' cargo test -vvv
可以看到[你的包名 版本号] CARGO_CFG_MY_TEST_FLAG=Ok("")
,并编译那个测试;而cargo test -vvv
显示[...] CARGO_CFG_MY_TEST_FLAG=Err(NotPresent)
,且不编译那个测试#[cfg(my_test_flag)]
放到测试函数上控制是否编译那个测试函数,你也可以放到 statements / items 之类任何条件编译支持的地方println!("env: {:?}", env::var("CARGO_CFG_TEST"));
的意思是通过 cfg flags 控制条件编译,在 build.rs 通过CARGO_CFG_*
感知。文档:https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts
比如,你的测试是条件编译控制的:
然后传递 cfg flags 就行了:
这会涉及一些条件编译的细节,不限于:
-vvv
可以打印完整的 build 阶段的输出(包括 build.rs,不过由于缓存,不是每次都会打印):RUSTFLAGS='--cfg=my_test_flag' cargo test -vvv
可以看到[你的包名 版本号] CARGO_CFG_MY_TEST_FLAG=Ok("")
,并编译那个测试;而cargo test -vvv
显示[...] CARGO_CFG_MY_TEST_FLAG=Err(NotPresent)
,且不编译那个测试#[cfg(my_test_flag)]
放到测试函数上控制是否编译那个测试函数,你也可以放到 statements / items 之类任何条件编译支持的地方