Building and publishing WebAssembly components
Wasm Shell (wash) is the comprehensive command-line tool for developing, building, and publishing WebAssembly components.
In this section of the Developer Guide, you'll learn how to:
- Compile your project to a WebAssembly component binary
- Publish your component to an OCI registry
If you haven't completed the previous section on installing wash, creating a project, and starting a developer loop, we recommend starting there.
Building WebAssembly components
Use the wash build command from the root of a project directory to compile the component into a .wasm binary:
wash buildThe output path for the compiled .wasm binary varies by language toolchain and can be configured via wash's config.json file.
- Rust
- TinyGo
- TypeScript
By default, the compiled .wasm binary for a Rust project is generated at /target/wasm32-wasip2/debug/.
By default, the compiled .wasm binary for a TinyGo project is generated at /build/.
By default, the compiled .wasm binary for a TypeScript project is generated at /dist/.
You can find more options for the wash build command in the Command Reference.
Interface dependencies and wash build
When you run wash build, wash reads the specified world in your WIT files and downloads the appropriate dependencies automatically into the wit/deps directory. As such, in most cases you should add wit/deps to your .gitignore file.
Without any additional configuration, wash can download dependencies from the following namespaces (i.e. the wasi in wasi:http@0.2.1):
wasi: Interfaces proposed for the common WebAssembly System Interface (WASI) standardwasmcloud: Interfaces maintained as part of the wasmCloud project (see the Capability Catalog to find first-party interfaces)wrpc: Interfaces maintained as part of the WIT-over-RPC (wRPC) projectba: Interfaces maintained by the Bytecode Alliance
Components and OCI registries
Once you're finished iterating on your component, you can publish it to any OCI compliant registry that supports OCI artifacts. These artifacts are not container images, but conform to OCI standards and may be stored on any OCI-compatible registry.
Authenticating to OCI registries
wash supports the usage of Docker credentials for authentication to registries. There are multiple ways to authenticate with Docker credentials, including the docker login command with the docker CLI:
docker login <registry> -u <username> -p <password-or-token> Publishing to OCI registries
Push the component to your registry:
wash oci push ghcr.io/<namespace>/hello:0.2.0 ./dist/http-hello-world.wasm- The target registry address (including artifact name and tag) are specified for the first option with
wash oci push. - The second option defines the target path for the component binary to push.