diff --git a/packages/cli/src/cli/build_assets.rs b/packages/cli/src/cli/build_assets.rs new file mode 100644 index 0000000000..52998effce --- /dev/null +++ b/packages/cli/src/cli/build_assets.rs @@ -0,0 +1,29 @@ +use std::{fs::create_dir_all, path::PathBuf}; + +use crate::{Result, StructuredOutput}; +use clap::Parser; +use dioxus_cli_opt::{process_file_to, AssetManifest}; + +#[derive(Clone, Debug, Parser)] +pub struct BuildAssets { + /// The source executable to build assets for. + pub(crate) executable: PathBuf, + + /// The destination directory for the assets + pub(crate) destination: PathBuf, +} + +impl BuildAssets { + pub async fn run(self) -> Result { + let mut manifest = AssetManifest::default(); + manifest.add_from_object_path(&self.executable)?; + + create_dir_all(&self.destination)?; + for (source_path, asset) in manifest.assets.iter() { + let destination_path = self.destination.join(asset.bundled_path()); + process_file_to(asset.options(), source_path, &destination_path)?; + } + + Ok(StructuredOutput::Success) + } +} diff --git a/packages/cli/src/cli/mod.rs b/packages/cli/src/cli/mod.rs index 1c3844e106..8e1fc2d227 100644 --- a/packages/cli/src/cli/mod.rs +++ b/packages/cli/src/cli/mod.rs @@ -1,5 +1,6 @@ pub(crate) mod autoformat; pub(crate) mod build; +pub(crate) mod build_assets; pub(crate) mod bundle; pub(crate) mod check; pub(crate) mod clean; @@ -95,6 +96,10 @@ pub(crate) enum Commands { #[clap(subcommand)] #[clap(name = "config")] Config(config::Config), + + /// Build the assets for a specific target. + #[clap(name = "build_assets")] + BuildAssets(build_assets::BuildAssets), } impl Display for Commands { @@ -112,6 +117,7 @@ impl Display for Commands { Commands::Bundle(_) => write!(f, "bundle"), Commands::Run(_) => write!(f, "run"), Commands::Doctor(_) => write!(f, "doctor"), + Commands::BuildAssets(_) => write!(f, "build_assets"), } } } diff --git a/packages/cli/src/main.rs b/packages/cli/src/main.rs index 3f92e9d0f5..0bdd69d81c 100644 --- a/packages/cli/src/main.rs +++ b/packages/cli/src/main.rs @@ -53,6 +53,7 @@ async fn main() { Commands::Bundle(opts) => opts.bundle().await, Commands::Run(opts) => opts.run().await, Commands::Doctor(opts) => opts.run().await, + Commands::BuildAssets(opts) => opts.run().await, }; // Provide a structured output for third party tools that can consume the output of the CLI