#[cfg(feature = "test")]
pub mod test;
# 背景
目前有一个功能,是在 测试环境走test ip
,线上走 prod ip
,一开始是想用 环境变量来做区分,但仔细想想,如图配置环境变量来走的话,每次更改或者发布都需要再某个机器上来注册这个变量,如果有很多变量的情况下很不好维护,然后想到 rust 有 feature
这个功能,看能否使用这个来实现目前的需求。
# 介绍
features
(opens new window),直接看 rust-book 会好一点 哈哈哈哈哈
# 使用
先到 配置文件 中自定义 feature
,然后再到代码中去使用
- 第一种使用方式,通过 cfg 属性宏 (opens new window):
# Cargo.toml
[features]
test = []
prod = []
#[cfg(feature = "test")]
pub mod test;
impl test {
pub fn new() -> Self {
todo!()
}
}
- 第二种使用方式,通过 cfg 宏 (opens new window):
# Cargo.toml
[features]
test = []
prod = []
let mut ip: &str = "x.x.x.x:8080";
if cfg!(feature = "test") {
ip = "xxxxx";
} else if cfg!(feature = "prod") {
ip = "xxxxx";
}
这里我们使用了第二种方法解决了我们的问题 👏
# 问题
如果想要启用 子包中 自定义的 feature ,可能要通过 子包/feature 的方式来层层启用,因为目前我们的项目结构是这样的:
└──项目
├── packages
| |-- package1
| |-- package2
│ └── package3
├── xxx
│-- Cargo.lock
└── Cargo.toml
[workspace]
members = ["packages/package1","packages/package2","packages/package3"]
default-members = ["packages/package2"]
所以我们的入口其实是在 package2
这个 二进制包,所以默认 运行 cargo run | build
时走的都是 package2
,所以我们想要启用在 package3
下的 自定义 功能时,需要在 入口包下(package2
) 的 Cargo.toml
也要定义如下代码:
...
[features]
test = ['package2/test']
prod = ['package2/prod']
这样在 运行 cargo build --features test
时,才会启用 子包的 test feature