项目基础信息
包元数据配置
toml
[package]
name = "chrono"
version = "0.4.42"
description = "Date and time library for Rust"
homepage = "https://github.com/chronotope/chrono"
documentation = "https://docs.rs/chrono/"
repository = "https://github.com/chronotope/chrono"
keywords = ["date", "time", "calendar"]
categories = ["date-and-time"]
readme = "README.md"
license = "MIT OR Apache-2.0"
include = ["src/*", "tests/*.rs", "LICENSE.txt", "CITATION.cff"]
edition = "2021"
rust-version = "1.62.0"
关键信息:
- 版本:0.4.42(遵循语义化版本控制)
- 许可证:双重许可(MIT 或 Apache-2.0)
- Rust版本:最低支持 1.62.0
- 代码风格:使用 2021 edition
特性系统架构
默认特性配置
toml
default = ["clock", "std", "oldtime", "wasmbind"]
默认特性包含:
clock:系统时钟支持std:标准库功能oldtime:向后兼容性wasmbind:WebAssembly 绑定
核心特性详解
基础特性
toml
alloc = [] # 堆分配支持(字符串格式化等)
std = ["alloc"] # 标准库支持(包含 alloc)
core-error = [] # 核心错误处理支持
时间功能特性
toml
clock = ["winapi", "iana-time-zone", "now"] # 系统时钟读取
now = ["std"] # 当前时间获取
平台特定特性
toml
wasmbind = ["wasm-bindgen", "js-sys"] # WebAssembly 支持
libc = [] # Unix 系统调用
winapi = ["windows-link"] # Windows API
序列化特性
toml
rkyv = ["dep:rkyv", "rkyv/size_32"] # 零拷贝序列化(默认32位)
rkyv-16 = ["dep:rkyv", "rkyv?/size_16"] # 16位版本
rkyv-32 = ["dep:rkyv", "rkyv?/size_32"] # 32位版本
rkyv-64 = ["dep:rkyv", "rkyv?/size_64"] # 64位版本
rkyv-validation = ["rkyv?/validation"] # 验证支持
重要约束 :rkyv-16、rkyv-32、rkyv-64 是互斥特性。
国际化特性
toml
unstable-locales = ["pure-rust-locales"] # 本地化支持(实验性)
调试特性
toml
defmt = ["dep:defmt", "pure-rust-locales?/defmt"] # 嵌入式日志支持
依赖关系管理
核心依赖
toml
[dependencies]
num-traits = { version = "0.2", default-features = false }
serde = { version = "1.0.99", default-features = false, optional = true }
pure-rust-locales = { version = "0.8.2", optional = true }
rkyv = { version = "0.7.43", optional = true, default-features = false }
arbitrary = { version = "1.0.0", features = ["derive"], optional = true }
defmt = { version = "1.0.1", optional = true }
依赖特点:
- num-traits:数值特性支持,禁用默认特性以减小二进制大小
- 可选依赖:所有功能依赖都是可选的,支持最小化编译
- 特性传递 :通过
default-features = false控制特性传播
平台特定依赖
WebAssembly 支持
toml
[target.'cfg(all(target_arch = "wasm32", not(any(target_os = "emscripten", target_os = "wasi"))))'.dependencies]
wasm-bindgen = { version = "0.2", optional = true }
js-sys = { version = "0.3", optional = true }
条件编译:仅在 WASM32 架构且非 Emscripten/WASI 目标时启用。
Windows 平台支持
toml
[target.'cfg(windows)'.dependencies]
windows-link = { version = "0.2", optional = true }
Unix 平台支持
toml
[target.'cfg(unix)'.dependencies]
iana-time-zone = { version = "0.1.45", optional = true, features = ["fallback"] }
特性配置 :启用 fallback 特性,在时区信息不可用时提供回退机制。
开发依赖配置
测试和序列化工具
toml
[dev-dependencies]
serde_json = { version = "1" }
serde_derive = { version = "1", default-features = false }
similar-asserts = { version = "1.6.1" }
bincode = { version = "1.3.0" }
windows-bindgen = { version = "0.65" }
工具选择:
- serde_json/serde_derive:JSON 序列化测试
- similar-asserts:改进的断言输出
- bincode:二进制序列化测试
- windows-bindgen:Windows API 绑定生成
WebAssembly 测试支持
toml
[target.'cfg(all(target_arch = "wasm32", not(any(target_os = "emscripten", target_os = "wasi"))))'.dev-dependencies]
wasm-bindgen-test = "0.3"
文档和发布配置
文档生成配置
toml
[package.metadata.docs.rs]
features = ["arbitrary", "rkyv", "serde", "unstable-locales"]
rustdoc-args = ["--cfg", "docsrs"]
文档策略:
- 启用所有主要特性展示完整 API
- 使用
docsrs配置条件编译文档 - 确保在线文档的完整性
Playground 演示配置
toml
[package.metadata.playground]
features = ["serde"]
演示重点:突出序列化功能,这是最常用的特性之一。
设计哲学分析
1. 模块化设计
- 特性标志:所有功能都通过特性控制
- 可选依赖:最小化默认依赖树
- 条件编译:平台特定代码分离
2. 性能优化
- 默认特性精简:避免不必要的依赖
default-features = false:防止依赖传递膨胀- 编译时优化:通过特性选择优化代码路径
3. 跨平台支持
- WASM 优先:默认包含 wasmbind 特性
- 平台抽象:通过特性统一不同平台 API
- 渐进增强:基础功能在 no_std 环境下可用
4. 向后兼容性
- oldtime 特性:保持与旧版本兼容
- 语义化版本:明确的版本管理
- MSRV 策略:明确的最低 Rust 版本支持
5. 开发者体验
- 完整文档:所有特性在文档中展示
- 测试覆盖:全面的平台特定测试
- 示例丰富:Playground 集成演示
使用场景配置示例
最小化嵌入式配置
toml
chrono = { version = "0.4", default-features = false, features = ["alloc"] }
标准应用配置
toml
chrono = { version = "0.4", features = ["serde"] }
完整功能配置
toml
chrono = { version = "0.4", features = ["serde", "rkyv", "unstable-locales"] }
WebAssembly 配置
toml
chrono = { version = "0.4", default-features = false, features = ["wasmbind", "clock"] }
这个配置文件体现了现代 Rust 库的最佳实践:模块化、性能优化、跨平台支持和优秀的开发者体验。