From 10cd48b19efbf2887399787877c239c19f2fa93e Mon Sep 17 00:00:00 2001 From: arctic-hen7 Date: Wed, 8 Feb 2023 09:24:05 +1100 Subject: [PATCH] feat(cli): added `--verbose` for easier logging Note that this will *not* print server logs in testing. --- packages/perseus-axum/src/lib.rs | 2 ++ packages/perseus-cli/src/build.rs | 7 +++-- packages/perseus-cli/src/check.rs | 14 ++++++--- packages/perseus-cli/src/cmd.rs | 29 +++++++++++++++---- packages/perseus-cli/src/export.rs | 7 +++-- packages/perseus-cli/src/export_error_page.rs | 1 + packages/perseus-cli/src/install.rs | 3 ++ packages/perseus-cli/src/parse.rs | 6 ++++ packages/perseus-cli/src/serve.rs | 20 ++++++++++--- packages/perseus-cli/src/test.rs | 4 ++- packages/perseus-cli/src/tinker.rs | 7 +++-- 11 files changed, 79 insertions(+), 21 deletions(-) diff --git a/packages/perseus-axum/src/lib.rs b/packages/perseus-axum/src/lib.rs index a56d2c888a..3b9fa7e4d5 100644 --- a/packages/perseus-axum/src/lib.rs +++ b/packages/perseus-axum/src/lib.rs @@ -57,6 +57,8 @@ pub async fn get_router, opts: ServerOptions, ) -> Router { + dbg!("Server started!"); + let router = Router::new() // --- File handlers --- .route( diff --git a/packages/perseus-cli/src/build.rs b/packages/perseus-cli/src/build.rs index 6c64ccd61b..cb82361622 100644 --- a/packages/perseus-cli/src/build.rs +++ b/packages/perseus-cli/src/build.rs @@ -49,6 +49,7 @@ pub fn build_internal( cargo_browser_args, wasm_bindgen_args, wasm_opt_args, + verbose, .. } = global_opts.clone(); wasm_release_rustflags.push_str(" --cfg=client"); @@ -94,7 +95,8 @@ pub fn build_internal( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0) @@ -146,7 +148,8 @@ pub fn build_internal( ("RUSTFLAGS", "--cfg=client"), ("CARGO_TERM_COLOR", "always"), ] - } + }, + verbose, )?); Ok(0) diff --git a/packages/perseus-cli/src/check.rs b/packages/perseus-cli/src/check.rs index 66f2192dcd..42e7286fc2 100644 --- a/packages/perseus-cli/src/check.rs +++ b/packages/perseus-cli/src/check.rs @@ -86,6 +86,7 @@ fn cargo_check( let Opts { cargo_engine_args, cargo_browser_args, + verbose, .. } = global_opts.clone(); @@ -125,7 +126,8 @@ fn cargo_check( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0) @@ -146,7 +148,8 @@ fn cargo_check( ("CARGO_TARGET_DIR", "dist/target_wasm"), ("RUSTFLAGS", "--cfg=client"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0) @@ -166,7 +169,9 @@ fn run_static_generation( global_opts: &Opts, ) -> Result { let Opts { - cargo_engine_args, .. + cargo_engine_args, + verbose, + .. } = global_opts.clone(); let msg = format!( @@ -189,7 +194,8 @@ fn run_static_generation( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0) diff --git a/packages/perseus-cli/src/cmd.rs b/packages/perseus-cli/src/cmd.rs index 9654d7d7b1..8f3e3fe4c5 100644 --- a/packages/perseus-cli/src/cmd.rs +++ b/packages/perseus-cli/src/cmd.rs @@ -12,11 +12,16 @@ pub static FAILURE: Emoji<'_, '_> = Emoji("❌", "failed!"); /// Runs the given command conveniently, returning the exit code. Notably, this /// parses the given command by separating it on spaces. Returns the command's /// output and the exit code. +/// +/// If `full_logging` is set to `true`, this will share stdio with the parent +/// process, meaning the user will see all their app's logs, no matter what. If +/// not, logs will only be printed on a failure. pub fn run_cmd( cmd: String, dir: &Path, envs: Vec<(&str, &str)>, pre_dump: impl Fn(), + full_logging: bool, ) -> Result<(String, String, i32), ExecutionError> { // We run the command in a shell so that NPM/Yarn binaries can be recognized // (see #5) @@ -49,8 +54,13 @@ pub fn run_cmd( // Print `stderr` and `stdout` only if there's something therein and the exit // code is non-zero If we only print `stderr`, we can miss some things (see // #74) - if !output.stderr.is_empty() && exit_code != 0 { - pre_dump(); + // + // Or, if we're being verbose, log everything anyway + if full_logging || (!output.stderr.is_empty() && exit_code != 0) { + if !output.stderr.is_empty() && exit_code != 0 { + pre_dump() + }; + std::io::stderr().write_all(&output.stdout).unwrap(); std::io::stderr().write_all(&output.stderr).unwrap(); } @@ -89,15 +99,22 @@ pub fn run_stage( spinner: &ProgressBar, message: &str, envs: Vec<(&str, &str)>, + full_logging: bool, ) -> Result<(String, String, i32), ExecutionError> { let mut last_output = (String::new(), String::new()); // Run the commands for cmd in cmds { // We make sure all commands run in the target directory ('.perseus/' itself) - let (stdout, stderr, exit_code) = run_cmd(cmd.to_string(), target, envs.to_vec(), || { - // This stage has failed - fail_spinner(spinner, message); - })?; + let (stdout, stderr, exit_code) = run_cmd( + cmd.to_string(), + target, + envs.to_vec(), + || { + // This stage has failed + fail_spinner(spinner, message); + }, + full_logging, + )?; last_output = (stdout, stderr); // If we have a non-zero exit code, we should NOT continue (stderr has been // written to the console already) diff --git a/packages/perseus-cli/src/export.rs b/packages/perseus-cli/src/export.rs index 08f94d8768..d7ac0cdf24 100644 --- a/packages/perseus-cli/src/export.rs +++ b/packages/perseus-cli/src/export.rs @@ -159,6 +159,7 @@ pub fn export_internal( cargo_engine_args, wasm_bindgen_args, wasm_opt_args, + verbose, mut wasm_release_rustflags, .. } = global_opts.clone(); @@ -205,7 +206,8 @@ pub fn export_internal( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0) @@ -257,7 +259,8 @@ pub fn export_internal( ("RUSTFLAGS", "--cfg=client"), ("CARGO_TERM_COLOR", "always"), ] - } + }, + verbose, )?); Ok(0) diff --git a/packages/perseus-cli/src/export_error_page.rs b/packages/perseus-cli/src/export_error_page.rs index 91d881b19e..ad993763f6 100644 --- a/packages/perseus-cli/src/export_error_page.rs +++ b/packages/perseus-cli/src/export_error_page.rs @@ -31,6 +31,7 @@ pub fn export_error_page( ("CARGO_TERM_COLOR", "always"), ], || {}, + global_opts.verbose, )?; if prompt { diff --git a/packages/perseus-cli/src/install.rs b/packages/perseus-cli/src/install.rs index bee19fef00..d8eb905786 100644 --- a/packages/perseus-cli/src/install.rs +++ b/packages/perseus-cli/src/install.rs @@ -116,6 +116,9 @@ impl Tools { ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always"), ], + // Sure, the user *might* want logs on this process (but this will only be run the + // first time) + global_opts.verbose, ) .map_err(|err| InstallError::LockfileGenerationFailed { source: err })?; if exit_code != 0 { diff --git a/packages/perseus-cli/src/parse.rs b/packages/perseus-cli/src/parse.rs index 01d126defb..9e555aad58 100644 --- a/packages/perseus-cli/src/parse.rs +++ b/packages/perseus-cli/src/parse.rs @@ -82,6 +82,12 @@ pub struct Opts { /// should set this for CI) #[clap(long, global = true)] pub no_system_tools_cache: bool, + /// Shows the logs from building and serving your app no matter what (the + /// default is to only show them on a compilation/build failure); this + /// is intended mainly for end-to-end debugging, although the `snoop` + /// commands are more useful for targeted debugging + #[clap(long, global = true)] + pub verbose: bool, } #[derive(Parser, Clone)] diff --git a/packages/perseus-cli/src/serve.rs b/packages/perseus-cli/src/serve.rs index 91e7adf6d1..de553987cc 100644 --- a/packages/perseus-cli/src/serve.rs +++ b/packages/perseus-cli/src/serve.rs @@ -83,7 +83,10 @@ fn build_server( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + // These are JSON logs, never print them (they're duplicated by the build logs + // anyway, we're compiling the same thing) + false, )?); let msgs: Vec<&str> = stdout.trim().split('\n').collect(); @@ -135,6 +138,7 @@ fn run_server( exec: Arc>, dir: PathBuf, num_steps: u8, + verbose: bool, ) -> Result { // First off, handle any issues with the executable path let exec_val = exec.lock().unwrap(); @@ -153,8 +157,16 @@ fn run_server( // This needs to be provided in development, but not in production .env("PERSEUS_ENGINE_OPERATION", "serve") // We should be able to access outputs in case there's an error - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) + .stdout(if verbose { + Stdio::inherit() + } else { + Stdio::piped() + }) + .stderr(if verbose { + Stdio::inherit() + } else { + Stdio::piped() + }) .spawn() .map_err(|err| ExecutionError::CmdExecFailed { cmd: server_exec_path, @@ -272,7 +284,7 @@ pub fn serve( // Now actually run that executable path if we should if should_run { - let exit_code = run_server(Arc::clone(&exec), dir, num_steps)?; + let exit_code = run_server(Arc::clone(&exec), dir, num_steps, global_opts.verbose)?; Ok((exit_code, None)) } else { // The user doesn't want to run the server, so we'll give them the executable diff --git a/packages/perseus-cli/src/test.rs b/packages/perseus-cli/src/test.rs index c1331b1948..1624df1193 100644 --- a/packages/perseus-cli/src/test.rs +++ b/packages/perseus-cli/src/test.rs @@ -34,6 +34,7 @@ pub fn test( let Opts { cargo_engine_path, cargo_engine_args, + verbose, .. } = global_opts.clone(); @@ -119,7 +120,8 @@ pub fn test( ("CARGO_TERM_COLOR", "always"), ("PERSEUS_RUN_WASM_TESTS", "true"), ] - } + }, + verbose, )?); Ok(0) diff --git a/packages/perseus-cli/src/tinker.rs b/packages/perseus-cli/src/tinker.rs index 97b762a7ac..1340e218d8 100644 --- a/packages/perseus-cli/src/tinker.rs +++ b/packages/perseus-cli/src/tinker.rs @@ -38,7 +38,9 @@ pub fn tinker_internal( > { let tools = tools.clone(); let Opts { - cargo_engine_args, .. + cargo_engine_args, + verbose, + .. } = global_opts.clone(); // Tinkering message @@ -65,7 +67,8 @@ pub fn tinker_internal( ("CARGO_TARGET_DIR", "dist/target_engine"), ("RUSTFLAGS", "--cfg=engine"), ("CARGO_TERM_COLOR", "always") - ] + ], + verbose, )?); Ok(0)