3 releases (breaking)
new 0.3.0 | Feb 9, 2025 |
---|---|
0.2.0 | Feb 1, 2025 |
0.1.0 | Sep 7, 2024 |
#523 in Build Utils
248 downloads per month
Used in cicero
29KB
411 lines
Unstable: Cicero Distibution
Need to pack multiple files into an archive?
Cicero provides an API for specifying the file structure and then deferring to your functions to provide the contents:
use std::{fs, path::Path};
use cicero_distribution::Distribution;
use cicero_path::repo_path;
fn main() -> anyhow::Result<()> {
let distribution = Distribution::new("myproject")?;
distribution
.add_file_from_path("README.md", repo_path!("README.md"))?
.add_file("myproject", |file| build_backend_executable(file))?;
distribution
.dir("public")?
.add_all(|dir| build_frontend(dir))?;
let archive_path = distribution.bundle_as_tar_gz()?;
Ok(())
}
fn build_frontend(out_dir: &Path) -> anyhow::Result<()> {
let build_out_dir: &Path = unimplemented!();
fs::rename(build_out_dir, out_dir)?;
Ok(())
}
fn build_backend_executable(out_file: &Path) -> anyhow::Result<()> {
let build_out_file: &Path = unimplemented!();
fs::rename(build_out_file, out_file)?;
Ok(())
}
Advantages to this approach:
- File structure is documented and trivially correct.
- Conflicts due to two code locations modifying the same files are practically eliminated.
- Obvious where to jump into the code to change a portion of the distribution.
- Less path wrangling. Your function has the complete path passed to it. No need to modify it further.
- Your functions become naturally testable. You can pass a temporary path (e.g. from
assert_fs
) instead and assert on that.
Mind that this API may still see larger changes, as more features are implemented.
Dependencies
~0.7–9.5MB
~107K SLoC