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
+```
+
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 475d4db..c6bad24 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("wasm_pack")?,
+ 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();
+}