feat: add cli support to build assets from executable (#3429)

* feat: add cli support to build assets from executable

See https://github.com/DioxusLabs/dioxus/discussions/3402#discussioncomment-11632372

* fix: store relative paths in executable

* bring back deprecation warning

---------

Co-authored-by: Jonathan Kelley <jkelleyrtp@gmail.com>
This commit is contained in:
Brian MayandJonathan Kelley authored and GitHub committed 2025-04-15 14:51:04 -07:00
1 parent 2c5de0a713
commit 5109a4b745
4 files changed
+48 -1

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
use std::{fs::create_dir_all, path::PathBuf};
use crate::{Result, StructuredOutput};
use clap::Parser;
use dioxus_cli_opt::{process_file_to, AssetManifest};
use tracing::debug;
#[derive(Clone, Debug, Parser)]
pub struct BuildAssets {
/// The source executable to build assets for.
pub(crate) executable: PathBuf,
/// The source directory for the assets.
pub(crate) source: PathBuf,
/// The destination directory for the assets.
pub(crate) destination: PathBuf,
}
impl BuildAssets {
pub async fn run(self) -> Result<StructuredOutput> {
let mut manifest = AssetManifest::default();
manifest.add_from_object_path(&self.executable)?;
create_dir_all(&self.destination)?;
for (path, asset) in manifest.assets.iter() {
let source_path = self.source.join(path);
let destination_path = self.destination.join(asset.bundled_path());
debug!(
"Processing asset {} --> {} {:#?}",
source_path.display(),
destination_path.display(),
asset
);
process_file_to(asset.options(), &source_path, &destination_path)?;
}
Ok(StructuredOutput::Success)
}
}
+6
View File
@@ -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;
@@ -90,6 +91,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 {
@@ -106,6 +111,7 @@ impl Display for Commands {
Commands::Check(_) => write!(f, "check"),
Commands::Bundle(_) => write!(f, "bundle"),
Commands::Run(_) => write!(f, "run"),
Commands::BuildAssets(_) => write!(f, "build_assets"),
}
}
}
+1
View File
@@ -57,6 +57,7 @@ async fn main() {
Commands::Serve(opts) => opts.serve().await,
Commands::Bundle(opts) => opts.bundle().await,
Commands::Run(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
+1 -1
View File
@@ -48,7 +48,7 @@ impl BundledAsset {
/// Create a new asset but with a relative path
///
/// This method is deprecated and will be removed in a future release.
#[deprecated(
#[deprecated(
note = "Relative asset!() paths are not supported. Use a path like `/assets/myfile.png` instead of `./assets/myfile.png`"
)]
pub const fn new_relative(