diff --git a/docs/src/commands/build.md b/docs/src/commands/build.md index 2305f50..96371fc 100644 --- a/docs/src/commands/build.md +++ b/docs/src/commands/build.md @@ -90,6 +90,17 @@ wasm-pack build examples/js-hello-world --mode no-install | `no-install` | `wasm-pack init` implicitly and create wasm binding without installing `wasm-bindgen`. | | `normal` | do all the stuffs of `no-install` with installed `wasm-bindgen`. | +## Extra options + +The `build` command can pass extra options straight to `cargo build` even if they are not +supported in wasm-pack. To use them you should add standalone `--` argument at the very +end of your command, and all the arguments you want to pass to cargo should go after. +For example to build previous example using unstable cargo offline feature: + +``` +wasm-pack build examples/js-hello-world --mode no-install -- -Z offline +``` +
0 If you need to include additional assets in the pkg diff --git a/src/build.rs b/src/build.rs index e240c43..9e29c6d 100644 --- a/src/build.rs +++ b/src/build.rs @@ -61,7 +61,12 @@ pub fn rustup_add_wasm_target(step: &Step) -> Result<(), Error> { } /// Run `cargo build` targetting `wasm32-unknown-unknown`. -pub fn cargo_build_wasm(path: &Path, profile: BuildProfile, step: &Step) -> Result<(), Error> { +pub fn cargo_build_wasm( + path: &Path, + profile: BuildProfile, + step: &Step, + extra_options: &Vec, +) -> Result<(), Error> { let msg = format!("{}Compiling to WASM...", emoji::CYCLONE); PBAR.step(step, &msg); let mut cmd = Command::new("cargo"); @@ -84,6 +89,7 @@ pub fn cargo_build_wasm(path: &Path, profile: BuildProfile, step: &Step) -> Resu } } cmd.arg("--target").arg("wasm32-unknown-unknown"); + cmd.args(extra_options); child::run(cmd, "cargo build").context("Compiling your crate to WebAssembly failed")?; Ok(()) } diff --git a/src/command/build.rs b/src/command/build.rs index 4b1efa4..29b1eaf 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -31,6 +31,7 @@ pub struct Build { pub out_dir: PathBuf, pub bindgen: Option, pub cache: Cache, + pub extra_options: Vec, } /// The `BuildMode` determines which mode of initialization we are running, and @@ -120,6 +121,10 @@ pub struct BuildOptions { #[structopt(long = "out-dir", short = "d", default_value = "pkg")] /// Sets the output directory with a relative path. pub out_dir: String, + + #[structopt(last = true)] + /// List of extra options to pass to `cargo build` + pub extra_options: Vec, } impl Default for BuildOptions { @@ -135,6 +140,7 @@ impl Default for BuildOptions { release: false, profiling: false, out_dir: String::new(), + extra_options: Vec::new(), } } } @@ -175,6 +181,7 @@ impl Build { out_dir, bindgen: None, cache: Cache::new()?, + extra_options: build_opts.extra_options, }) } @@ -282,7 +289,7 @@ impl Build { fn step_build_wasm(&mut self, step: &Step) -> Result<(), Error> { info!("Building wasm..."); - build::cargo_build_wasm(&self.crate_path, self.profile, step)?; + build::cargo_build_wasm(&self.crate_path, self.profile, step, &self.extra_options)?; info!( "wasm built at {:#?}.", diff --git a/tests/all/build.rs b/tests/all/build.rs index cc21fbb..d4f4deb 100644 --- a/tests/all/build.rs +++ b/tests/all/build.rs @@ -228,3 +228,19 @@ fn build_with_and_without_wasm_bindgen_debug() { ); } } + +#[test] +fn build_with_arbitrary_cargo_options() { + let fixture = utils::fixture::js_hello_world(); + fixture.install_local_wasm_bindgen(); + + let cli = Cli::from_iter_safe(vec![ + "wasm-pack", + "build", + &fixture.path.display().to_string(), + "--", + "--no-default-features", + ]) + .unwrap(); + fixture.run(cli.cmd).unwrap(); +}