添加依赖库时的 features 是什么?优雅实现编译期条件编译与模块化开发

现代C++工具包:机器学习算法与高性能计算的模块化实现 在现代软件开发中,C++因其高性能和系统级控制能力,常被用于计算密集型场景。通过模板元编程和RAII等核心机制,C++能够实现类型安全的泛型设计和自动资源管理,这为构建高效、可靠的基础设施提供了技术保障。在机器学习与科学计算领域,矩阵运算、线性代数和经典算法(如排序与图论算法)是底层基石,其性能直接影响模型训练和推理效率。现代C++工具包将这些算法以模块化方式整合,采用头文件库设计,便于快速集成和原型验证。它特别适合嵌入式系统、高性能计算以及对第三方依赖敏感的项目,为开发者提供了从理论到实践的清晰路径,是理 阅读详情

添加依赖库时的 features 是什么?优雅实现编译期条件编译与模块化开发

当我们依赖库时,有时候需要添加 features 相关的配置,那么这个 features 到底是什么呢?其实,它是 Rust 的 Feature Flags(特性标志),这篇文章将带你一次性搞清楚它。

先搞懂 features 是什么

当我们添加依赖库时,所配置的 features,它是依赖库预定义的功能开关。依赖库开发者会将自身的功能拆分为多个独立模块,每个模块对应一个或多个 feature,使用者通过启用或禁用这些 feature,控制依赖库中哪些代码会被编译到自己的项目中。

举个最常见的例子,我们常用的序列化库 serde,其核心功能是序列化与反序列化,但“自动派生 Serialize/Deserialize 特征”这一功能,被封装在了 derive 这个 feature 中。如果我们不需要自动派生,就可以不启用该 feature,从而减少依赖体积;如果需要就启用它,如下所示:

serde = { version = "1.0", features = ["derive"] }

总结来说,依赖库的 features 有两个核心价值,分别对应开发者和使用者:

  • 对依赖库开发者:将不同功能模块化拆分,避免所有功能打包在一起,减少使用者的依赖负担;同时支持功能的灵活组合,适配不同场景需求。
  • 对依赖使用者:按需选择所需功能,不引入无用代码和依赖,减小编译时间、降低二进制文件体积,尤其适合嵌入式、WASM 等资源敏感场景。

而我们自己项目中配置的 Feature Flags,与依赖库的 features 本质一致,都是基于 Cargo 的条件编译机制,只是作用范围不同:依赖库的 features 作用于依赖本身,而项目自身的 Feature Flags 作用于当前项目,两者可以协同工作,实现更精细的功能控制。

添加依赖库时,如何配置 features?

添加依赖时,配置 features 的核心是按需选择依赖库提供的功能,常见方式有三种,结合具体示例说明:

启用单个 feature

当我们只需要依赖库的某一个可选功能时,直接在依赖配置中通过 features 指定单个 feature:

[dependencies]
# 启用 serde 的 derive feature
serde = { version = "1.0", features = ["derive"] }
# 启用 reqwest 的 json feature
reqwest = { version = "0.13", features = ["json"] }

启用多个 feature

需要多个可选功能时,将 feature 放入数组中,用逗号分隔:

[dependencies]
# 启用 reqwest 的 json 和 sync 两个 feature
reqwest = { version = "0.13", features = ["json", "sync"] }

禁用默认 feature,再启用所需 feature

很多依赖库会有默认启用的 feature 集合(通过 default 关键字定义),如果默认 feature 包含我们不需要的功能,可以禁用默认 feature,再手动启用所需功能,避免依赖膨胀:

[dependencies]
# 禁用 serde 的默认 feature,仅启用 derive feature
serde = { version = "1.0", default-features = false, features = ["derive"] }

可以通过依赖库的官方文档,查看其提供的所有可配置 feature,避免盲目启用不需要的功能。

自己的项目中,如何声明和使用 Feature Flags?

和依赖库的 features 一样,我们自己的项目也可以声明 Feature Flags,实现自身功能的模块化拆分。

第一步:在 Cargo.toml 中声明特性

特性的声明在 Cargo.toml 的 [features] 段落中进行,支持多种声明方式,对应不同场景:

简单特性(无依赖)

最基础的特性仅作为开关,不依赖任何其他特性或依赖包,仅用于控制自身代码的编译:

[features]
# 声明一个简单特性,用于控制日志功能
logging = []
# 声明一个简单特性,用于控制调试功能
debug_mode = []
默认特性(default)

默认特性是用户不指定任何特性时自动启用的特性集合,通过 default 关键字声明,方便开箱即用:

[features]
# 默认启用logging特性
default = ["logging"]
logging = []
debug_mode = []
依赖关联特性(关联自身依赖)

和依赖库的用法一致,我们的项目也可以将特性与自身的可选依赖绑定,只有启用该特性时,才引入对应的依赖包:

[features]
# 声明 serde-support 特性,关联 serde 依赖
serde-support = ["dep:serde", "dep:serde_json"]
# 或简写为
# serde-support = ["serde?", "serde_json?"]

[dependencies]
# 标记 serde 为可选依赖,不启用 serde-support 特性时不会被编译
serde = { version = "1.0", optional = true, features = ["derive"] }
serde_json = { version = "1.0", optional = true }
组合特性(特性依赖)

一个特性可以依赖其他特性,形成组合特性,方便用户一次性启用多个相关功能。例如声明一个全功能(full)特性,包含所有可选功能:

[features]
default = ["logging"]
logging = []
serde-support = ["dep:serde", "dep:serde_json"]
# 组合特性:启用 logging 和 serde-support,用户只需启用 full 即可
full = ["logging", "serde-support"]

第二步:在代码中使用特性

声明特性后,通过 Rust 的条件编译属性和宏,控制不同特性对应的代码逻辑。常用方式有三种,和依赖库的特性逻辑完全一致:

#[cfg(feature = "...")] 属性

最常用的方式,用于标记函数、模块、结构体等代码块,仅在指定特性启用时才会被编译。例如,我们的项目中,只有启用 logging 特性,才编译日志模块:

// 仅当 logging 特性启用时,编译该模块
#[cfg(feature = "logging")]
pub mod logger {
    use std::fmt;

    pub fn init() {
        println!("日志系统初始化完成");
    }

    pub fn log(message: &str) {
        println!("[LOG] {}", message);
    }
}

// 仅当 debug_mode 特性启用时,编译该函数
#[cfg(feature = "debug_mode")]
pub fn debug_print(data: &str) {
    eprintln!("[DEBUG] {}", data);
}

// 当 logging 特性未启用时,提供一个空实现,避免导入报错
#[cfg(not(feature = "logging"))]
pub mod logger {
    pub fn init() {}
    pub fn log(_message: &str) {}
}

fn main() {
    // 启用 logging 时,会执行 init 和 log
    logger::init();
    logger::log("程序启动");

    // 启用 debug_mode 时,才会打印调试信息
    #[cfg(feature = "debug_mode")]
    debug_print("调试信息:程序正常运行");
}
cfg! 宏

用于在代码块内部进行特性检查,返回一个布尔值(编译期计算),适合根据特性执行不同的逻辑分支。需要注意:cfg! 宏仅用于判断,不会剔除未启用特性的代码,未启用特性的分支仍会被编译,但不会执行:

fn process_data(data: &str) {
    // 检查 logging 特性是否启用(无论是自身项目的,还是依赖库的)
    if cfg!(feature = "logging") {
        logger::log(format!("处理数据:{}", data).as_str());
    }

    // 检查多个特性组合(all 表示同时启用,any 表示至少一个启用)
    if cfg!(all(feature = "logging", feature = "debug_mode")) {
        debug_print("正在处理数据,开启完整日志");
    }
}
#[cfg_attr(...)] 宏

用于条件性地为代码添加属性,例如根据特性启用 derive 宏、禁用警告等,简化代码冗余。例如,只有启用 serde-support 特性,才为结构体添加序列化派生:

// 仅当 serde-support 特性启用时,为 User 结构体添加 Serialize 和 Deserialize 派生
#[cfg_attr(feature = "serde-support", derive(serde::Serialize, serde::Deserialize))]
pub struct User {
    pub id: u64,
    pub name: String,
}

进阶实践:依赖库 features 与自身 Feature Flags 协同工作

在实际开发中,我们很少单独使用依赖库的 features 或自身的 Feature Flags,更多是两者协同工作,实现更精细的功能控制和依赖管理。以下是几个高频实用场景:

自身特性关联依赖库的 features

我们可以将自身的 Feature Flags 与依赖库的 features 绑定,启用自身某个特性时,自动启用依赖库对应的特性,避免用户手动配置。例如,自身的 serde-support 特性,关联 serde 库的 derive 特性:

[features]
# 自身的 serde-support 特性,关联 serde 的 derive 特性
serde-support = ["dep:serde", "serde/derive", "dep:serde_json"]
# 或简写为
# serde-support = ["serde?/derive", "serde_json?"]

[dependencies]
serde = { version = "1.0", optional = true }
serde_json = { version = "1.0", optional = true }

这样,当用户启用我们项目的 serde-support 特性时,会自动启用 serde 库的 derive 特性,无需用户额外配置 features = ["derive"]。

互斥特性与编译期验证(含依赖场景)

有时,我们的项目特性与依赖库的特性可能互斥,例如,自身项目的 tokio-runtime 特性与依赖库的 async-std-runtime 特性不能同时启用。此时可以通过编译期检查,避免用户误配置:

// 若同时启用自身的 tokio-runtime 和依赖库的 async-std-runtime,编译报错
#[cfg(all(feature = "tokio-runtime", feature = "dep:async-std/runtime"))]
compile_error!("无法同时启用tokio-runtime和async-std的runtime特性,请选择其中一个");

// 若未启用任何运行时特性,编译报错
#[cfg(not(any(feature = "tokio-runtime", feature = "dep:async-std/runtime"))]
compile_error!("必须启用tokio-runtime或async-std的runtime特性中的一个");

// 启用自身 tokio-runtime 特性时,使用 tokio 运行时
#[cfg(feature = "tokio-runtime")]
pub mod runtime {
    use tokio;
    pub fn run() {
        tokio::runtime::Runtime::new().unwrap().block_on(async {
            println!("使用tokio运行时");
        });
    }
}

// 启用依赖库 async-std 的 runtime 特性时,使用 async-std 运行时
#[cfg(feature = "dep:async-std/runtime")]
pub mod runtime {
    use async_std;
    pub fn run() {
        async_std::task::block_on(async {
            println!("使用async-std运行时");
        });
    }
}

Workspace 中,统一管理多包与依赖的 features

在大型项目(Workspace)中,多个子包可能依赖同一个第三方库,且需要统一配置该依赖的 features。可以在 Workspace 根目录的 Cargo.toml 中声明共享特性,子包通过语法关联,实现特性的统一管理:

# 根目录 Cargo.toml
[workspace]
members = ["core", "utils"]

[features]
# 共享特性:全功能,关联子包和依赖的 features
full = ["core/full", "utils/full", "core/dep:serde", "core/dep:serde/derive"]

# 子包 core/Cargo.toml
[features]
default = ["basic"]
basic = []
serde-support = ["dep:serde", "dep:serde_json"]
full = ["basic", "serde-support"]

[dependencies]
serde = { version = "1.0", optional = true }
serde_json = { version = "1.0", optional = true }

# 子包 utils/Cargo.toml
[features]
default = ["log"]
log = []
crypto = []
full = ["log", "crypto"]

性能优化:按需启用依赖与特性

在性能敏感场景(如嵌入式、WASM)中,我们可以通过自身特性+依赖 features 的组合,实现极致的依赖裁剪。例如,开发环境启用详细日志和依赖库的调试特性,生产环境禁用这些开销:

[features]
# 开发环境特性:启用日志和依赖的调试功能
dev = ["logging", "debug_mode", "dep:reqwest", "dep:reqwest/debug"]
# 生产环境特性:仅启用核心功能
prod = ["serde-support"]
default = ["prod"]

[dependencies]
reqwest = { version = "0.13", default-features = false, features = ["json"] }
serde = { version = "1.0", optional = true, features = ["derive"] }
serde_json = { version = "1.0", optional = true }

开发时执行 cargo build --features dev,启用调试和日志;生产时执行 cargo build --features prod,仅保留核心功能,减小编译体积和运行开销。

最佳实践

遵循可加性原则

特性必须是可加的(additive),这意味着启用特性只能添加功能,不能移除或修改已有功能。例如:若两个特性互斥,当一个依赖启用 A、另一个依赖启用 B 时,会导致编译失败。在实际开发中,尽可能保证让特性可共存,如果确实需要互斥通过 compile_error! 宏做编译期检查,提前暴露错误。

规范特性命名

特性命名应遵循语义清晰、简洁统一的原则,避免模糊或技术细节相关的命名,推荐:自身特性 serde-support(关联 serde 依赖)、async(异步支持)、full(全功能),引用依赖特性 dep:serde/derive,明确是 serde 的 derive 特性。

处理特性传递性,避免意外依赖

当项目 A 依赖库 B,库 B 启用了某个特性时,该特性会向上传递,可能导致项目 A 引入不必要的依赖,增加二进制体积。推荐是在引入依赖时,使用 default-features = false 禁用默认特性,再手动启用所需特性。

完善特性测试

不同特性组合可能引入隐藏 bug,因此需要为关键组合编写测试用例。可以通过 Cargo 的 --features 参数指定特性组合运行测试:

# 测试默认特性
cargo test
# 测试开发特性
cargo test --features dev
# 测试自身特性与依赖特性组合
cargo test --features "serde-support,reqwest?/json"

总结

最后,建议你在实际开发中多尝试:引入依赖时,查看其文档选择必需的 features;自己开发项目时,合理拆分特性,避免过度设计。相信通过实践,你能更灵活地运用这一工具,写出更优雅、更高效的 Rust 代码。

用矿卡P104-100在PVE 8.0.4上跑Ollama:保姆级显卡直通与驱动安装避坑指南 本文详细介绍了如何在PVE 8.0.4环境下通过显卡直通技术,利用矿卡P104-100高效部署本地大模型Ollama的全流程。从硬件配置、BIOS设置到驱动安装和性能调优,提供了保姆级的避坑指南和实战解决方案,特别针对矿卡无显示输出的特殊性进行了优化。 阅读详情

相关推荐

人大金仓数据库Kingbase FlySync同步程序安装

Kingbase FlySync同步程序(以下简称 KFS)是面向异地容灾、数据集中共享的场景推出的具备在异构数据平台间实现实时、增量数据同步的工具类产品,主要采用了物理日志解析技术,帮助用户解决不同数据平台的数据间可实现任意方向实时移动流转的问题,并保证此过程中数据不丢失,状态可监控,流转数据量可统计。KFS 需要安装的主要组件有 2 个,分别是后端同步程序和管理控制平台,另外KFS的部署方式也有2种,为分离部署何集中部署•集中部署:KFS与数据库部署在同一机器上。

weixin_44312518的博客 1180

每日一个rust小技巧:features特性介绍(内容来自豆包AI)

在库的。

2301_78858267的博客 1278

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1130

Unity3D宏定义实战:如何用平台宏优化你的跨平台游戏开发流程

本文深入探讨了Unity3D宏定义在跨平台游戏开发中的高效应用策略。通过平台宏(如UNITY_IOS、UNITY_ANDROID)实现代码隔离和编译时优化,结合实战案例展示了API调用、资源管理等场景的最佳实践,帮助开发者提升开发效率和代码质量。

weixin_30772105的博客 455

51单片机也能玩转GC9A01彩屏?超详细移植指南与性能优化技巧

本文详细介绍了如何在51单片机上高效驱动GC9A01彩屏,包括硬件连接优化、SPI模拟驱动、内存管理策略及高级刷新技术。通过分段缓冲、颜色压缩和差异化刷新等技巧,显著提升显示性能,使51单片机也能流畅运行240x240分辨率的彩色TFT屏幕。

hp777的博客 190

永磁同步电机FOC控制实战:如何用线性死区补偿解决低速抖动问题(附Matlab仿真代码)

本文详细介绍了永磁同步电机FOC控制中线性死区补偿技术的工程实现方法,有效解决低速抖动问题。通过Matlab/Simulink仿真验证,该方案可将转矩脉动降低70%以上,显著提升系统稳定性。文章包含完整的数学模型构建、Simulink实现步骤及参数整定技巧,为工程师提供实用解决方案。

weixin_30872499的博客 155

C++模板本质:编译期类型工厂与零开销抽象机制

C++模板是一种在编译期生成特化代码的泛型编程机制,不同于Java泛型的类型擦除,它通过模板实例化为每种实际类型生成独立、高效的目标代码。其核心原理涵盖参数推导、SFINAE约束、重载决议与依赖类型解析,技术价值在于实现零运行时开销、极致性能与强类型安全。典型应用场景包括标准容器(如vector)、算法(如std::sort)及现代可选类型(optional)。本文深入剖析函数模板、类模板、变参模板及Concepts演进,聚焦c++函数模版实现细节与c++八大排序算法背后的模板工程实践。

weixin_30855099的博客 378

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

Rust实现高级反调试与反分析技术:构建安全软件保护层

在软件安全领域,反调试与反分析技术是保护核心代码逻辑、防止逆向工程的关键手段。其基本原理是通过检测程序运行环境、干扰分析工具、混淆代码逻辑等方式,增加攻击者理解和篡改软件的难度。这些技术的核心价值在于提升软件的安全性,保护知识产权,并延长产品的安全生命周期。在应用场景上,广泛用于恶意软件分析对抗、游戏安全保护、软件许可验证以及商业软件的核心算法防护。本文将探讨如何利用Rust语言的内存安全特性和高性能优势,结合RedOps(红队操作)中的隐匿技术思想,系统性地实现环境感知、行为干扰和核心保护等多层防御机制,

weixin_34214500的博客 321

手把手教你用TUSB2E22中继器实现eUSB2与USB 2.0互转(附实测数据对比)

本文详细介绍了如何利用TUSB2E22中继器实现eUSB2与USB 2.0的高效互转,包括技术背景、硬件设计要点、信号完整性测试方法及故障排查策略。通过实测数据对比,展示了TUSB2E22在信号延迟、功耗和眼图性能上的显著优势,为工程师提供了实用的工程方案。

weixin_29199873的博客 284

小红书私信接口与Hook技术实战:微信跳转卡片的合规与破解之道

本文深入探讨了小红书私信接口与Hook技术的实战应用,重点解析了微信跳转卡片的合规使用与破解方法。通过官方私信接口的合规玩法与Xposed框架的Hook技术对比,为开发者提供了技术选型指南和实战建议,帮助实现高效的用户跳转与转化。

weixin_30399821的博客 740

Rust嵌入式固件设计:具身机器人边缘运行时与升级治理

具身机器人(Embodied AI)要求边缘设备在严苛物理约束下实现高实时性、强鲁棒性与可维护性。其核心挑战在于将内存安全、确定性调度与低功耗计算统一于裸机环境——Rust凭借零成本抽象、no_std支持和编译期验证能力,成为突破功耗墙、确定性墙与部署墙的系统级解。静态评测(Static Evaluation)并非仅分析源码,而是通过内存足迹剖面、最坏执行时间(WCET)建模与治理策略编码,构建可验证的可信基线;升级治理(Update Governance)则将签名验证、双区原子切换与电量/温度等物理条件检

weixin_34050519的博客 246

医学图像的对抗攻击:模型安全性与鲁棒性分析

医学图像的对抗攻击:模型安全性与鲁棒性分析 ,人工智能,计算机视觉,大模型,AI,本文围绕医学图像的对抗攻击展开,分析了其对AI模型的威胁。介绍了对抗样本定义、攻击原理,以及FGSM、BIM、PGD等常见攻击方法,还给出了相关代码示例。阐述了攻击对模型诊断准确性和可信度的影响,提出对抗训练、输入预处理、模型集成等提升模型安全性与鲁棒性的方法,探讨了评估指标、数据集和流程,分析了实际应用中的挑战与应对策略,最后展望了未来发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

Lore Server 插件依赖策略剖析:基于 server_main() 入口点的二进制分层架构

本篇技术指南围绕 Lore 仓库的架构决策记录 [ADR-00013:Plugin dependency strategy for Lore Server modularization](https://link.gitcode.com/i/d50c343e13f5d71b9b6795e6c5df05e2) 展开,系统讲解 Lore Server 如何在**零修改基础工作区(base worksp

gitblog_00211的博客 424

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

构建高效终端用户界面:Ratatui实战项目完整指南

在终端环境中构建美观实用的用户界面一直是开发者的挑战,而Ratatui作为Rust生态中的终端用户界面(TUI)库,提供了完整的解决方案。本文将通过一个待办事项应用的实战项目,深入解析如何使用Ratatui构建功能完整的终端应用。 [![Ratatui终端用户界面展示](https://raw.gitcode.com/gh_mirrors/ra/ratatui/raw/36854ef4f1af3

gitblog_00565的博客 519

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

mbed OS源码架构深度拆解:HAL、RTOS、驱动与测试体系解析

嵌入式物联网开发中,硬件抽象层(HAL)与实时操作系统(RTOS)是支撑设备高效运行的两大基石。HAL通过统一的C接口屏蔽不同MCU厂商的寄存器差异,使上层代码可跨芯片复用;RTOS则提供线程调度、信号量、消息队列等并发原语,保障多任务实时响应。围绕HAL与RTOS,驱动框架将外设控制封装为易用的C++类,而自动化测试体系则确保每一次底层改动不破坏既有功能。mbed OS作为Arm推出的开源嵌入式平台,完整融合了这四层设计,以清晰的目录结构、稳定的ABI接口和工程化的测试工具链,为Cortex-M系列MCU

weixin_34301132的博客 408

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

rust: Fan-out/Fan-in Pattern

本项目基于Rust实现珠宝行业全流程的扇出/扇入模式,采用DDD六层架构。通过ProcessRequestDto与ProcessResponseDto传输数据,将采购、设计、生产等12个业务阶段抽象为可并行执行的FanoutTask子任务。核心由JewelryFanoutFanin实现并行调度:先扇出至12个线程并发执行,再统一扇入汇总结果。系统集成日志(文件+控制台)、重试熔断、内存仓储及依赖注入容器,支持顺序与并发两种调度方式,确保高并发下任务可靠执行与可观测性。

Geovin Du Dream Park 153

组网第63课:安全域划分——Trust/Untrust/DMZ、区域模型、与 VLAN 的关系

一组接口 + 一组策略 + 一条默认拒绝。一组接口:这个域包含哪些物理口、VLAN、子接口;一组策略:这个域到别的域放行什么、拒绝什么;一条默认拒绝:没写进策略的,一律不通。第三条最关键。没有默认拒绝,前面划的域全是装饰。

qq_36765170的博客 559

Rust组织管理(AI回答)

你想做的事JS / Python 做法Rust 做法把一个文件纳入工程新建文件即可新建 xxx.rs 后,必须在入口写mod xxx;挂载对外暴露函数/结构体export(Python 默认全公开)默认全私有,必须显式加pub引入别处的函数use crate::模块名::函数名;找路径的基准词./ 或 ../(从 src 根出发)、(上一级 ../)、(当前级 ./)日常写项目:不要用 #[path],直接遵守默认规则——

yaoct的博客 140

自建 RustDesk 服务端后,做一个“装完就能连“的客户端

目前市面上的远程工具(如向日葵、toDesk等)免费版基本上都卡的不行,而且收费版好像也会卡。如果有云服务的话,可以基于 RustDesk 的 hbbs / hbbr 自己部署一套,不过会碰到一个问题:每台电脑装完客户端,都得手动去设置里填三样东西——ID 服务器、中继服务器、Key。填错一个就连不上,还得远程指导同事操作。这篇记录两种解决办法,以及云端编译的完整流程。内容基于 RustDesk 1.5.3 的源码。

风声的专栏 371

GitHub 热榜项目:日榜(2026-11-07)

给编码智能体配技能的项目最热:cloudflare/security-audit-skill 把审计拆成六阶段并输出可验证 JSON,新增 2,548 星;mattpocock/skills 把工程技能放进 .agents 目录,新增 2,070 星。Web 应用框架也有四个项目集中上榜,以 react/react 为代表。

u130130的博客 406

OpenObserve 的日志别堆本地盘:用 RustFS 当它的对象存储底座

OpenObserve 跑起来默认把日志转成的 Parquet 文件写在本地盘上。比如你给三四个服务接了日志,本地盘眼看着要满,又不想为了日志专门养一套分布式存储,这层本地存储就成了绕不开的瓶颈。把对象存储当成它唯一的持久层,OpenObserve 的节点就彻底无状态了:日志进来落进 RustFS 桶,节点挂了换一台照常查,扩容只要加桶容量而不是挪磁盘。把对象存储当成它唯一的持久层,OpenOb…

分布式存储与RustFS的博客 580

GitHub 热榜项目:日榜(2026-11-10)

本期共 11 个热门开源项目,合计新增 13,136 stars。榜单前三分别是 Anthropic 的 Agent Skills 仓库、Meta 开源的 React 设计系统 Astryx(+3,278)和用户名检索工具 sherlock(+4,267,本期涨星最多)。其余项目覆盖 DeepMind 的物理引擎 MuJoCo、Claude 官方示例集、自托管智能体记忆系统 GBrain、用 Rust 写的浏览器自动化 CLI、基于 WiFi 信号的人体感知平台 RuView、多市场股票分析工具,以及 Ho

u130130的博客 435

Rolldown 把插件改动回传提速 26 倍

Rolldown 下一个版本会把插件改动的回传做细,只把真的改了的字段送回 Rust,大型项目里这一步从 1015 毫秒降到 39 毫秒。什么时候能用上呢,改动已经在 11 月 6 日合并,会跟着下一个版本走,Vite 8 用的就是 Rolldown。更麻烦的是缓存,Rust 替换 chunk 数据之后,之前那份代码缓存就废了,下一个读。这次没有动钩子对象本身,只是把「回传」这件事做细了,先看哪些字段变了,再决定传什么。所以改法很直接,只送变了的字段,没变的 chunk 一个字节都不发。

前端之虎陈随易 201

Rust 日志追踪实战:工业边缘场景下的 tracing

Rust 生态下:相比println!log,它提供结构化字段、span 上下文、异步友好和 OpenTelemetry 集成。本文从工程实战角度梳理 tracing 的用法与常见的坑。

ZenovaEdgeOS的博客 554

Rust如何实现微服务网关的高并发与限流熔断机制

在现代互联网系统中,微服务架构已成为主流,而微服务网关则是整个系统的重要组成部分。当面对高并发、高可用性需求时,很多开发者对如何用 Rust 实现一个稳定可靠的网关存在疑惑,尤其是处理请求的幂等性、限流和熔断机制。本文将以 Rust 的实际案例为基础,结合生产环境中的具体经验,讲解如何设计和实现一个具备限流与熔断能力的微服务网关。

wuchangjian的专栏 108
上一篇: Rust Pin 解析:核心原理与异步编程实践
下一篇: Reqwest 兼顾简洁与高性能的现代 HTTP 客户端
Rust研习社
博客等级 码龄11年 52粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值