3 个版本
0.1.2 | 2019年10月30日 |
---|---|
0.1.1 | 2019年10月30日 |
0.1.0 | 2019年10月30日 |
#496 in 配置
3,961 每月下载量
在 49 个 Crates 中使用 (8 直接使用)
19KB
143 行
const_env
动机
你的目标:你希望在编译时根据环境变量定义代码中的各种常量。
你的问题:在当前的 Rust 中,只能为 &'static str
常量执行此操作。
const MY_STR: &'static str = env!("SOME_ENV");
你不能以类似的方式初始化其他类型,如常量 u32
、bool
或其他原始类型。请参阅 问题 和 解决方案。一旦支持在 const fn
中运行 parse
和 unwrap
,你最终将能够这样做,但到目前为止,此 crate 提供了一个易于使用的解决方案,你可以立即使用。
使用方法
添加依赖项。
[dependencies]
const_env = "0.1"
在文件顶部导入 from_env!
宏。
use const_env::from_env;
使用宏在构建时根据环境变量覆盖常量的值。
#[from_env]
const FOO: u32 = 123;
// This test will PASS if invoked as `FOO=456 cargo test`
#[test]
fn test() {
assert_eq!(456, FOO);
}
默认情况下,该宏查找与它附加的常量同名的环境变量。
// Use `FOO=true cargo build` to configure the value.
#[from_env]
const FOO: bool = false;
但您也可以明确指定名称。
// Use `BAR=true cargo build` to configure the value.
#[from_env("BAR")]
const FOO: bool = false;
在源代码中分配的表达式在环境变量不存在时充当默认值。
// If env var FOO is not set then the FOO constant will have the default value of '🦀'.
#[from_env]
const FOO: char = '🦀';
支持 const
和 static
声明。
// Both of these may be set by `FOO=abc BAZ=def cargo build`.
#[from_env]
const FOO: &'static str = "hello";
#[from_env("BAZ")]
static BAR: &'static [u8] = b"world";
支持的类型
字符串!
#[from_env]
const FOO: &'static str = "hello";
// example: `FOO=abc cargo build`
// results in:
const FOO: &'static str = "abc";
字节字符串!
#[from_env]
const FOO: &'static [u8] = b"hello";
// example: `FOO=world cargo build`
// results in:
const FOO: &'static [u8] = b"world";
字节!
#[from_env]
const FOO: u8 = b'⚙';
// example: `FOO=🦀 cargo build`
// results in:
const FOO: u8 = b'🦀';
字符!
#[from_env]
const FOO: char = '⚙';
// example: `FOO=🦀 cargo build`
// results in:
const FOO: car = '🦀';
各种形状和大小的整数!
#[from_env]
const FOO: u32 = 123;
#[from_env]
const BAR: i64 = 456;
#[from_env]
const BAZ: usize = 0;
// example: `FOO=321 BAR=-456 BAZ=1usize cargo build`
// results in:
const FOO: u32 = 321;
const BAR: i64 = -456;
const BAZ: usize = 1usize;
各种形状和大小的浮点数!
#[from_env]
const FOO: f32 = 123.0;
#[from_env]
const BAR: f64 = 456.0;
#[from_env]
const BAZ: f32 = 0.0;
// example: `FOO=321.0 BAR=-456.0 BAZ=1f32 cargo build`
// results in:
const FOO: f32 = 321.0;
const BAR: f64 = -456.0;
const BAZ: f32 = 1f32;
布尔值!
#[from_env]
const FOO: bool = false;
// example: `FOO=true cargo build`
// results in:
const FOO: bool = true;
已知限制
- 仅支持顶级
const
和static
声明。
替代方案
依赖项
~1.5MB
~36K SLoC