6 个版本 (重大更改)

0.5.0 2024 年 7 月 22 日
0.4.0 2024 年 7 月 9 日
0.3.0 2024 年 5 月 20 日
0.2.0 2024 年 5 月 16 日
0.0.0 2024 年 4 月 16 日

#1298 in WebAssembly

Download history 138/week @ 2024-05-11 201/week @ 2024-05-18 21/week @ 2024-05-25 11/week @ 2024-06-01 10/week @ 2024-06-08 12/week @ 2024-06-15 6/week @ 2024-06-22 6/week @ 2024-06-29 128/week @ 2024-07-06 35/week @ 2024-07-13 127/week @ 2024-07-20 53/week @ 2024-07-27 16/week @ 2024-08-03 21/week @ 2024-08-10 28/week @ 2024-08-17

每月 126 次下载

Apache-2.0 WITH LLVM-exception

620KB
13K SLoC

WebAssembly 组合(WAC)

一个 Bytecode Alliance 项目

一个用于组合 WebAssembly 组件 的工具。

build status Crates.io version Download docs.rs docs

概述

wac 是一个用于组合 WebAssembly 组件 的工具。

该工具使用 WAC(发音为 "whack")语言来定义如何组合组件。

WAC 语言

wac 语言是用于描述组件如何组合的 wit 的声明式超集。

例如,想象两个名为 name.wasm 和 greeter.wasm 的组件。

name.wasm 的 wit 如下所示

package example:name;

world name {
  /// Exporting a 'name' function that returns a name to greet.
  export name: func() -> string;
}

greeter.wasm 的 wit 如下所示

package example:greeter;

world greeter {
  /// Importing a 'name' function that returns the name to greet.
  import name: func() -> string;
  /// Exporting a 'greet' function that returns a greeting using the name.
  export greet: func() -> string;
}

以下是一个 wac 文件示例,它通过将 name.wasm 的 "name" 导出插入到 greeter.wasm 的 "name" 导入中来组合这两个组件。

package example:composition;

// Instantiate the `name` component
let n = new example:name {};

// Instantiate the `greeter` component by plugging its `name`
// import with the `name` export of the `name` component.
let greeter = new example:greeter {
  name: n.name,
};

// Export the greet function from the greeter component
export greeter.greet;

编码此组合的结果是一个不导入任何内容且仅导出 "greet" 函数的单个组件。

有关 wac 语言的完整描述,请参阅 语言指南

安装

要从源代码安装 wac CLI,请运行以下命令

cargo install wac-cli

如果您已安装 cargo-binstall 工具,则可以通过预构建的发布工件安装 wac CLI,从而节省安装时间

cargo binstall wac-cli

用法

wac CLI 工具有以下命令

  • wac plug - 将一个或多个其他组件的导入插入到组件中。
  • wac compose - 使用提供的 WAC 源文件组合 WebAssembly 组件。
  • wac parse - 将组合解析为 AST 的 JSON 表示形式。
  • wac resolve - 将组合解析为 JSON 表示形式。

快速简单组合

要执行简单组合,请使用 wac plug 命令

wac plug my-socket.wasm --plug my-plug.wasm -o plugged.wasm

或混合发布到 Warg 注册表的包

wac plug my-namespace:package-name --plug some-namespace:other-package-name -o plugged.wasm

编码组合

要执行组合,请使用 wac compose 命令

wac compose -t input.wac

这将使用 input.wac 来执行组合并将组件的文本表示写入 stdout。

wac compose -o output.wasm input.wac

这将执行 input.wac 中指定的组合,并输出名为 output.wasm 的 WebAssembly 组件。

依赖项

默认情况下,wac 将创建一个组件,该组件在其内部嵌入其依赖项(即 WAC 源文件中引用的包)而不是导入这些依赖项;要使依赖项在输出组件中导入,请使用 --import-dependencies 标志

wac compose --import-dependencies -o output.wasm input.wac

依赖项可以位于一个 deps 子目录中,其结构如下

deps/
├─ <namespace>/
│  ├─ <package>.wasm

依赖项也可以是 WIT 文件或包含 WIT 包的目录

deps/
├─ <namespace>/
│  ├─ <package>/
│  │  ├─ a.wit
│  │  ├─ ...

可以使用 --deps-dir 命令行选项来指定搜索依赖项的不同目录。

也可以使用 --dep 命令行选项指定特定依赖项的位置

wac compose --dep foo:bar=./baz.wasm -o output.wasm input.wac

默认情况下,依赖项必须是二进制编码的 WebAssembly 组件;要启用对 WAT 文件的支持,请使用 wat 构建时功能。

如果使用默认功能构建,则依赖项可以从 Warg 注册表自动解决,并且不需要存在于 deps 子目录中或通过 --dep 命令行选项指定。

依赖项

~18–35MB
~525K SLoC