news 2026/8/20 17:32:40

shadow-rs Hook 机制实战:如何向构建产物注入自定义常量与函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
shadow-rs Hook 机制实战:如何向构建产物注入自定义常量与函数

shadow-rs Hook 机制实战:如何向构建产物注入自定义常量与函数

【免费下载链接】shadow-rsA build-time information stored in your rust project.(binary,lib,cdylib,dylib,wasm)项目地址: https://gitcode.com/gh_mirrors/sh/shadow-rs

shadow-rs 是一款在构建时(build-time)自动收集 Git、Cargo、环境变量与时间等信息,并生成构建产物(shadow.rs)的 Rust 构建辅助工具。本文将带你实战 shadow-rs 的Hook 机制,学会如何通过build.rs向构建产物注入自定义常量与自定义函数,让编译出的二进制自带你的专属信息,全程无需手写模板代码。

shadow-rs 从 Git、Rust Cargo、Env、Time 四大来源收集信息(如上图所示),默认就能生成VERSIONBRANCHCOMMIT_HASHBUILD_TIME等几十个内置常量。但项目常常还有「专属需求」,比如注入自定义 license、签名、编译人信息——这就是 Hook 机制的用武之地。

Hook 机制核心原理:一段写入文件末尾的代码

理解 Hook 之前,先看一条完整链路:build.rs调用ShadowBuilder生成OUT_DIR/shadow.rs,再通过shadow!(build)宏在运行时引入。

Hook 就是这条链路的「加塞入口」:构建脚本完成默认常量写入后,会执行你注册的闭包,把自定义内容追加到 shadow.rs 末尾。相关实现可参考:

  • ShadowBuilder::hook 注册方法
  • Shadow 生成文件时执行 hook
  • HookExt trait 定义

第一步:修改 Cargo.toml 启用构建脚本

Hook 依赖构建脚本,先在你的Cargo.toml中声明build = "build.rs",并把 shadow-rs 同时加入 dependencies 和 build-dependencies:

[package] build = "build.rs" [dependencies] shadow-rs = "0.3" [build-dependencies] shadow-rs = "0.3"

第二步:创建 build.rs 注册 Hook 函数

在项目根目录新建build.rs,通过.hook()传入一个接收&File的闭包,往文件里写入自定义常量与函数:

use std::io::Write; fn main() -> shadow_rs::SdResult<()> { shadow_rs::ShadowBuilder::builder() .hook(|f| { writeln!(f, r#"pub const HOOK_CONST: &str = "hello hook const";"#)?; writeln!(f, r#"pub fn hook_fn() -> &'static str {{ "hello hook bar fn" }}"#)?; Ok(()) }) .build()?; Ok(()) }

写入的常量、函数会被原样追加到构建产物末尾,随后即可在 Rust 代码中直接使用。

第三步:在 main.rs 中使用注入的自定义常量与函数

使用shadow!宏引入生成的build模块,然后像调用普通常量一样访问你注入的内容:

use shadow_rs::shadow; shadow!(build); fn main() { println!("const:{}", build::HOOK_CONST); // 'hello hook const' println!("fn:{}", build::hook_fn()); // 'hello hook bar fn' }

完整可运行示例见 example_shadow_hook/src/main.rs 及其 Cargo.toml,克隆仓库后执行cargo run即可看到注入的常量与函数被正确打印。

进阶技巧:Hook 与 deny_const 组合使用

Hook 还能与deny_const(禁止项)、BuildPattern(构建模式)自由组合:例如先屏蔽不需要的内置常量,再注入自定义字段,构建产物体积更小、内容更聚焦。构建模式还支持RealTime,确保每次提交代码后常量即时更新,适合 CI/CD 场景。

总结

shadow-rs 的 Hook 机制让「构建产物定制」变得极其简单:一个闭包 + 几行writeln!,就能注入任意自定义常量与函数,且与内置信息天然共存。无论是注入许可证、构建机器标识,还是自定义版本函数,Hook 都是优雅的扩展入口,值得每个 Rust 项目一试。

【免费下载链接】shadow-rsA build-time information stored in your rust project.(binary,lib,cdylib,dylib,wasm)项目地址: https://gitcode.com/gh_mirrors/sh/shadow-rs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 17:30:51

湘潭大学25年算法设计与分析考点回忆(软件工程)

1&#xff0c;贪心&#xff0c;贪心选择性质和最优子结构及二者关系2&#xff0c;代码填空矩阵连乘&#xff08;书上原代码&#xff09;&#xff0c;一个简单的贪心&#xff0c;要知道代码怎么写3&#xff0c;分治法&#xff0c;主方法求复杂度&#xff0c;递归方程求解&#x…

作者头像 李华
网站建设 2026/8/20 17:28:11

基于SpringBoot的智慧社区服务系统设计与实现(源码+讲解视频+LW)

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/20 17:24:18

通达信缠论插件实战体验:30分钟让K线图自动画出笔段与中枢

通达信缠论插件实战体验&#xff1a;30分钟让K线图自动画出笔段与中枢 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 晚上十一点&#xff0c;老张还在对着日线图一根根找顶底分型&#xff0c;拿尺子比划…

作者头像 李华