1 个不稳定版本
0.1.0 | 2024 年 5 月 20 日 |
---|
#307 in 构建工具
22KB
421 行
rz-embed
rz-embed 实现了一个简单的过程宏,用于在 Rust 二进制文件中嵌入目录树。所有文件在编译(或更准确地说,宏展开)时都进行 gzip 压缩。使用 lazy_static 在运行时解压缩资源。
我最初编写这个是为了将前端代码(svelte、angular 等)打包成 gzip 压缩的数据,嵌入到 rocket.rs 二进制文件中。将 rocket = true
添加到宏调用中,将自动生成相应的处理程序,以及一个 routes()
函数,以便轻松挂载它们。
用法
rz_embed::include_as_compressed!(
"src/some-data",
module_name = "some_data", // access files via some_data::FILENAME_SLUG
rocket = true // generate routes for each file
);
Rocket 路由 URL 相对于源目录,即
some-data/ipsum.md
->/ipsum.md
some-data/foo/ipsum.md
->/foo/ipsum.md
宏将输出压缩文件(以及压缩率)到标准输出
❯ cargo run --release --bin example-rocket
Compiling example-app v0.1.0 (rz-embed/example-app)
[~] rz-embed/example-app/src/frontend/index.html already compressed 388 -> 230 bytes (40.72%)
[~] rz-embed/example-app/src/frontend/index.css already compressed 33 -> 56 bytes (-69.70%)
[*] total: 421 -> 286 bytes (32.07%)
[+] rz-embed/example-app/src/some-data/ipsum.txt: 591 -> 207 bytes (64.97%)
[+] rz-embed/example-app/src/some-data/ipsum.md: 606 -> 215 bytes (64.52%)
[~] rz-embed/example-app/src/some-data/ipsum.xml already compressed 648 -> 255 bytes (60.65%)
[*] total: 1845 -> 677 bytes (63.31%)
Finished release [optimized] target(s) in 5.65s
Running `target/release/example-rocket`
🚀 Rocket has launched from http://127.0.0.1:8000
生成的路由可以与 <模块-名称>::routes()
一起收集
>> (serve_index) GET /index
>> (serve_index_css) GET /index.css
>> (serve_index_html) GET /index.html
>> (serve_ipsum_md) GET /data/ipsum.md
>> (serve_ipsum_txt) GET /data/ipsum.txt
>> (serve_ipsum_xml) GET /data/ipsum.xml
有关 示例应用程序 的 通用 和 rocket 示例,请参阅。
压缩
压缩文件存储在 target/rz-embed/<输入路径缩略语>/
example-app/target/rz-embed
├── [...]_rz_embed_example_app_src_frontend
│ ├── index_css.gz
│ └── index_html.gz
└── [...]_rz_embed_example_app_src_some_data
├── ipsum_md.gz
├── ipsum_txt.gz
└── ipsum_xml.gz
文件仅在压缩后发生更改时才会重新压缩,在宏展开时。这是通过文件元数据/mtime完成的 - 目前仅在Linux/ext4上进行了测试。
待办事项
- 如果压缩会增加文件大小,则跳过压缩(即不压缩小文件)
- 跳过已知压缩格式的压缩(即jpeg、zip等)
依赖关系
~3–12MB
~114K SLoC