From 99268acc052a4a5fddf9e0c43cf30caf383ea855 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Mon, 21 Aug 2023 16:05:25 -0500 Subject: [PATCH] add an option to skip assets in the CLI --- packages/cli/src/builder.rs | 36 +++++++++++++++----------- packages/cli/src/cli/build.rs | 10 +++---- packages/cli/src/cli/bundle.rs | 2 +- packages/cli/src/cli/cfg.rs | 11 ++++++++ packages/cli/src/cli/serve.rs | 8 +++--- packages/cli/src/server/desktop/mod.rs | 12 +++++---- packages/cli/src/server/web/mod.rs | 22 +++++++++------- playwright-tests/playwright.config.js | 6 ++--- 8 files changed, 64 insertions(+), 43 deletions(-) diff --git a/packages/cli/src/builder.rs b/packages/cli/src/builder.rs index 371a1291f..c7acd9aaa 100644 --- a/packages/cli/src/builder.rs +++ b/packages/cli/src/builder.rs @@ -22,7 +22,7 @@ pub struct BuildResult { pub elapsed_time: u128, } -pub fn build(config: &CrateConfig, quiet: bool) -> Result { +pub fn build(config: &CrateConfig, quiet: bool, skip_assets: bool) -> Result { // [1] Build the project with cargo, generating a wasm32-unknown-unknown target (is there a more specific, better target to leverage?) // [2] Generate the appropriate build folders // [3] Wasm-bindgen the .wasm fiile, and move it into the {builddir}/modules/xxxx/xxxx_bg.wasm @@ -241,7 +241,9 @@ pub fn build(config: &CrateConfig, quiet: bool) -> Result { } } - process_assets(config)?; + if !skip_assets{ + process_assets(config)?; + } Ok(BuildResult { warnings: warning_messages, @@ -249,7 +251,7 @@ pub fn build(config: &CrateConfig, quiet: bool) -> Result { }) } -pub fn build_desktop(config: &CrateConfig, _is_serve: bool) -> Result { +pub fn build_desktop(config: &CrateConfig, _is_serve: bool, skip_assets: bool) -> Result { log::info!("🚅 Running build [Desktop] command..."); let t_start = std::time::Instant::now(); @@ -351,10 +353,12 @@ pub fn build_desktop(config: &CrateConfig, _is_serve: bool) -> Result anyhow::Result> { Ok(warning_messages) } -pub fn gen_page(config: &CrateConfig, serve: bool) -> String { +pub fn gen_page(config: &CrateConfig, serve: bool, skip_assets: bool) -> String { let _gaurd = WebAssetConfigDropGuard::new(); let crate_root = crate::cargo::crate_root().unwrap(); @@ -461,14 +465,14 @@ pub fn gen_page(config: &CrateConfig, serve: bool) -> String { String::from(include_str!("./assets/index.html")) }; - let resouces = config.dioxus_config.web.resource.clone(); + let resources = config.dioxus_config.web.resource.clone(); - let mut style_list = resouces.style.unwrap_or_default(); - let mut script_list = resouces.script.unwrap_or_default(); + let mut style_list = resources.style.unwrap_or_default(); + let mut script_list = resources.script.unwrap_or_default(); if serve { - let mut dev_style = resouces.dev.style.clone().unwrap_or_default(); - let mut dev_script = resouces.dev.script.unwrap_or_default(); + let mut dev_style = resources.dev.style.clone().unwrap_or_default(); + let mut dev_script = resources.dev.script.unwrap_or_default(); style_list.append(&mut dev_style); script_list.append(&mut dev_script); } @@ -490,8 +494,10 @@ pub fn gen_page(config: &CrateConfig, serve: bool) -> String { { style_str.push_str("\n"); } - let manifest = config.asset_manifest(); - style_str.push_str(&manifest.head()); + if !skip_assets{ + let manifest = config.asset_manifest(); + style_str.push_str(&manifest.head()); + } replace_or_insert_before("{style_include}", &style_str, " { - crate::builder::build(&crate_config, false)?; + crate::builder::build(&crate_config, false, self.build.skip_assets)?; } Platform::Desktop => { - crate::builder::build_desktop(&crate_config, false)?; + crate::builder::build_desktop(&crate_config, false, self.build.skip_assets)?; } Platform::Fullstack => { // Fullstack mode must be built with web configs on the desktop (server) binary as well as the web binary @@ -60,7 +60,7 @@ impl Build { } None => web_config.features = Some(vec![web_feature]), }; - crate::builder::build(&crate_config, false)?; + crate::builder::build(&crate_config, false, self.build.skip_assets)?; } { let mut desktop_config = crate_config.clone(); @@ -72,12 +72,12 @@ impl Build { } None => desktop_config.features = Some(vec![desktop_feature]), }; - crate::builder::build_desktop(&desktop_config, false)?; + crate::builder::build_desktop(&desktop_config, false, self.build.skip_assets)?; } } } - let temp = gen_page(&crate_config, false); + let temp = gen_page(&crate_config, false, self.build.skip_assets); let mut file = std::fs::File::create( crate_config diff --git a/packages/cli/src/cli/bundle.rs b/packages/cli/src/cli/bundle.rs index 49979362c..9f82d8ba5 100644 --- a/packages/cli/src/cli/bundle.rs +++ b/packages/cli/src/cli/bundle.rs @@ -77,7 +77,7 @@ impl Bundle { } // build the desktop app - build_desktop(&crate_config, false)?; + build_desktop(&crate_config, false, false)?; // copy the binary to the out dir let package = crate_config.manifest.package.unwrap(); diff --git a/packages/cli/src/cli/cfg.rs b/packages/cli/src/cli/cfg.rs index bbe3119d3..3078e864f 100644 --- a/packages/cli/src/cli/cfg.rs +++ b/packages/cli/src/cli/cfg.rs @@ -32,6 +32,11 @@ pub struct ConfigOptsBuild { #[clap(long, value_enum)] pub platform: Option, + /// Skip collecting assets from dependencies [default: false] + #[clap(long)] + #[serde(default)] + pub skip_assets: bool, + /// Space separated list of features to activate #[clap(long)] pub features: Option>, @@ -57,6 +62,7 @@ impl From for ConfigOptsBuild { features: serve.features, client_feature: serve.client_feature, server_feature: serve.server_feature, + skip_assets: serve.skip_assets, } } } @@ -114,6 +120,11 @@ pub struct ConfigOptsServe { #[clap(long)] pub features: Option>, + /// Skip collecting assets from dependencies [default: false] + #[clap(long)] + #[serde(default)] + pub skip_assets: bool, + /// The feature to use for the client in a fullstack app [default: "web"] #[clap(long, default_value_t = { "web".to_string() })] pub client_feature: String, diff --git a/packages/cli/src/cli/serve.rs b/packages/cli/src/cli/serve.rs index 195b1ddf8..aa7380060 100644 --- a/packages/cli/src/cli/serve.rs +++ b/packages/cli/src/cli/serve.rs @@ -43,10 +43,10 @@ impl Serve { match platform { cfg::Platform::Web => { // generate dev-index page - Serve::regen_dev_page(&crate_config)?; + Serve::regen_dev_page(&crate_config, self.serve.skip_assets)?; // start the develop server - server::web::startup(self.serve.port, crate_config.clone(), self.serve.open) + server::web::startup(self.serve.port, crate_config.clone(), self.serve.open, self.serve.skip_assets) .await?; } cfg::Platform::Desktop => { @@ -59,8 +59,8 @@ impl Serve { Ok(()) } - pub fn regen_dev_page(crate_config: &CrateConfig) -> Result<()> { - let serve_html = gen_page(crate_config, true); + pub fn regen_dev_page(crate_config: &CrateConfig, skip_assets: bool) -> Result<()> { + let serve_html = gen_page(crate_config, true, skip_assets); let dist_path = crate_config.crate_dir.join( crate_config diff --git a/packages/cli/src/server/desktop/mod.rs b/packages/cli/src/server/desktop/mod.rs index 80df74fa4..94ae7c8c7 100644 --- a/packages/cli/src/server/desktop/mod.rs +++ b/packages/cli/src/server/desktop/mod.rs @@ -209,9 +209,9 @@ fn send_msg(msg: HotReloadMsg, channel: &mut impl std::io::Write) -> bool { } } -fn start_desktop(config: &CrateConfig) -> Result<(Child, BuildResult)> { +fn start_desktop(config: &CrateConfig, skip_assets: bool) -> Result<(Child, BuildResult)> { // Run the desktop application - let result = crate::builder::build_desktop(config, true)?; + let result = crate::builder::build_desktop(config, true, skip_assets)?; match &config.executable { crate::ExecutableType::Binary(name) @@ -233,11 +233,12 @@ fn start_desktop(config: &CrateConfig) -> Result<(Child, BuildResult)> { pub(crate) struct DesktopPlatform { currently_running_child: Child, + skip_assets: bool, } impl Platform for DesktopPlatform { - fn start(config: &CrateConfig, _serve: &ConfigOptsServe) -> Result { - let (child, first_build_result) = start_desktop(config)?; + fn start(config: &CrateConfig,serve: &ConfigOptsServe) -> Result { + let (child, first_build_result) = start_desktop(config, serve.skip_assets)?; log::info!("🚀 Starting development server..."); @@ -254,12 +255,13 @@ impl Platform for DesktopPlatform { Ok(Self { currently_running_child: child, + skip_assets: serve.skip_assets, }) } fn rebuild(&mut self, config: &CrateConfig) -> Result { self.currently_running_child.kill()?; - let (child, result) = start_desktop(config)?; + let (child, result) = start_desktop(config, self.skip_assets)?; self.currently_running_child = child; Ok(result) } diff --git a/packages/cli/src/server/web/mod.rs b/packages/cli/src/server/web/mod.rs index 7f09dca6c..16d57d6fd 100644 --- a/packages/cli/src/server/web/mod.rs +++ b/packages/cli/src/server/web/mod.rs @@ -47,7 +47,7 @@ struct WsReloadState { update: broadcast::Sender<()>, } -pub async fn startup(port: u16, config: CrateConfig, start_browser: bool) -> Result<()> { +pub async fn startup(port: u16, config: CrateConfig, start_browser: bool, skip_assets: bool) -> Result<()> { // ctrl-c shutdown checker let _crate_config = config.clone(); let _ = ctrlc::set_handler(move || { @@ -59,8 +59,8 @@ pub async fn startup(port: u16, config: CrateConfig, start_browser: bool) -> Res let ip = get_ip().unwrap_or(String::from("0.0.0.0")); match config.hot_reload { - true => serve_hot_reload(ip, port, config, start_browser).await?, - false => serve_default(ip, port, config, start_browser).await?, + true => serve_hot_reload(ip, port, config, start_browser, skip_assets).await?, + false => serve_default(ip, port, config, start_browser, skip_assets).await?, } Ok(()) @@ -72,8 +72,9 @@ async fn serve_default( port: u16, config: CrateConfig, start_browser: bool, + skip_assets: bool ) -> Result<()> { - let first_build_result = crate::builder::build(&config, false)?; + let first_build_result = crate::builder::build(&config, false, skip_assets)?; log::info!("🚀 Starting development server..."); @@ -86,7 +87,7 @@ async fn serve_default( { let config = config.clone(); let reload_tx = reload_tx.clone(); - move || build(&config, &reload_tx) + move || build(&config, &reload_tx, skip_assets) }, &config, Some(WebServerInfo { @@ -133,8 +134,9 @@ async fn serve_hot_reload( port: u16, config: CrateConfig, start_browser: bool, + skip_assets: bool ) -> Result<()> { - let first_build_result = crate::builder::build(&config, false)?; + let first_build_result = crate::builder::build(&config, false, skip_assets)?; log::info!("🚀 Starting development server..."); @@ -172,7 +174,7 @@ async fn serve_hot_reload( { let config = config.clone(); let reload_tx = reload_tx.clone(); - move || build(&config, &reload_tx) + move || build(&config, &reload_tx, skip_assets) }, Some(WebServerInfo { ip: ip.clone(), @@ -473,8 +475,8 @@ async fn ws_handler( }) } -fn build(config: &CrateConfig, reload_tx: &Sender<()>) -> Result { - let result = builder::build(config, true)?; +fn build(config: &CrateConfig, reload_tx: &Sender<()>, skip_assets: bool) -> Result { + let result = builder::build(config, true, skip_assets)?; // change the websocket reload state to true; // the page will auto-reload. if config @@ -484,7 +486,7 @@ fn build(config: &CrateConfig, reload_tx: &Sender<()>) -> Result { .reload_html .unwrap_or(false) { - let _ = Serve::regen_dev_page(config); + let _ = Serve::regen_dev_page(config, skip_assets); } let _ = reload_tx.send(()); Ok(result) diff --git a/playwright-tests/playwright.config.js b/playwright-tests/playwright.config.js index 54fe810a7..cd817d236 100644 --- a/playwright-tests/playwright.config.js +++ b/playwright-tests/playwright.config.js @@ -74,7 +74,7 @@ module.exports = defineConfig({ webServer: [ { command: - "cargo run --package dioxus-playwright-liveview-test --bin dioxus-playwright-liveview-test", + "cargo run --package dioxus-playwright-liveview-test --bin dioxus-playwright-liveview-test --skip-assets", port: 3030, timeout: 10 * 60 * 1000, reuseExistingServer: !process.env.CI, @@ -82,7 +82,7 @@ module.exports = defineConfig({ }, { cwd: path.join(process.cwd(), "web"), - command: "cargo run --package dioxus-cli -- serve", + command: "cargo run --package dioxus-cli --release -- serve --skip-assets", port: 8080, timeout: 10 * 60 * 1000, reuseExistingServer: !process.env.CI, @@ -90,7 +90,7 @@ module.exports = defineConfig({ }, { cwd: path.join(process.cwd(), 'fullstack'), - command: 'cargo run --package dioxus-cli -- build --features web --release\ncargo run --release --features ssr', + command: 'cargo run --package dioxus-cli --release -- build --features web --release --skip-assets\ncargo run --release --features ssr', port: 3333, timeout: 10 * 60 * 1000, reuseExistingServer: !process.env.CI,