人间熙攘,好久不见

vuePress-theme-reco Magic    2017 - 2023
人间熙攘,好久不见 人间熙攘,好久不见

Choose mode

  • dark
  • auto
  • light
Home
Category
  • tools
  • Zsh
  • iTerm2
  • Front-end
  • 版本控制-Git
  • Rust
  • skia-safe
  • 第三方对接
  • MQTT
  • Powershell
  • python
  • MD5
  • SHA1
  • wsl2
Tags
TimeLine
GitHub
  • Github (opens new window)
  • Before (opens new window)
author-avatar

Magic

23

文章

15

标签

Home
Category
  • tools
  • Zsh
  • iTerm2
  • Front-end
  • 版本控制-Git
  • Rust
  • skia-safe
  • 第三方对接
  • MQTT
  • Powershell
  • python
  • MD5
  • SHA1
  • wsl2
Tags
TimeLine
GitHub
  • Github (opens new window)
  • Before (opens new window)

Rust 自定义 feature 进行条件编译

vuePress-theme-reco Magic    2017 - 2023

Rust 自定义 feature 进行条件编译

Magic 2022-01-23 Rust
#[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

欢迎来到 人间熙攘,好久不见
看板娘