Expand description
Include large, compressed files in your binary without the high compile time cost.
This crate provides the include_packed!
macro as an efficient alternative to
std::include_bytes!
. It combines the fast compile-time approach of include-blob
with the binary size reduction of zstd
compression.
§How It Works
Instead of embedding file contents directly into your source code, this crate processes files in a build script.
- Build Script: You use the [
build::Config
] builder in yourbuild.rs
script. For native targets, it reads your asset files, compresses them withzstd
, and creates linkable object files. - Macro Expansion: The
include_packed!
macro in your code expands to an expression that links to the compressed data (on native) or embeds the compressed data directly (on Wasm). - Runtime: At runtime, the expression decompresses the data and returns it
as a
Vec<u8>
. Decompression is performed on each call.
This method significantly reduces compile times for projects with large binary assets and keeps the final executable size smaller.
§Usage
- Add
include_packed
to yourCargo.toml
. Thebuild
feature is required for build-dependencies.
[dependencies]
include_packed = "0.1.0"
[build-dependencies]
include_packed = { version = "0.1.0", features = ["build"] }
- Create a
build.rs
file in your project root to prepare the assets.
// build.rs
// This handles all platform-specific logic automatically.
include_packed::Config::new("assets")
.level(10) // Set a custom zstd compression level (optional)
.build()
.expect("Failed to pack assets");
- Use the macro in your code to include an asset.
// src/main.rs
use include_packed::include_packed;
// This returns a Vec<u8> with the decompressed file content.
let data: Vec<u8> = include_packed!("assets/my_file.txt");
println!("Decompressed data is {} bytes long.", data.len());
Macros§
- include_
packed - Includes a large, compressed binary file without high compile-time costs.