#目录树 # #二进制 #嵌入 #过程宏 #嵌入 #压缩

构建 rz-embed

rz-embed 实现了一个简单的过程宏,用于在 Rust 二进制文件中嵌入目录树。

1 个不稳定版本

0.1.0 2024 年 5 月 20 日

#307 in 构建工具

MIT/Apache

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