#wasm-module #wasm-binary #wasm-component #text-format #binary-format

bin+lib wasm-tools

用于与 WebAssembly 文件交互的 CLI 工具

77 个稳定版本

1.216.0 2024 年 8 月 22 日
1.215.0 2024 年 7 月 31 日
1.212.0 2024 年 6 月 27 日
1.202.0 2024 年 3 月 26 日
1.0.3 2022 年 2 月 17 日

577WebAssembly

Download history 870/week @ 2024-05-02 498/week @ 2024-05-09 922/week @ 2024-05-16 694/week @ 2024-05-23 744/week @ 2024-05-30 573/week @ 2024-06-06 782/week @ 2024-06-13 1026/week @ 2024-06-20 1743/week @ 2024-06-27 950/week @ 2024-07-04 1043/week @ 2024-07-11 1089/week @ 2024-07-18 1243/week @ 2024-07-25 998/week @ 2024-08-01 845/week @ 2024-08-08 886/week @ 2024-08-15

4,379 每月下载量

Apache-2.0…

4MB
85K SLoC

wasm-tools

Bytecode Alliance 项目

用于低级操作 WebAssembly 模块的 CLI 和 Rust 库

安装

每个版本都提供了在 CI 上构建的预编译工件,可用于下载。

要从源代码构建,首先 为您的平台安装 Rust,然后使用包含的 Cargo 软件包管理器进行安装

$ cargo install wasm-tools

或者如果您使用 cargo binstall,则可以使用它来安装 预编译工件

$ cargo binstall wasm-tools

可以使用以下命令确认安装

$ wasm-tools --version

可以使用以下命令探索子命令

$ wasm-tools help

示例

基本验证/打印

# Validate a WebAssembly file
$ wasm-tools validate foo.wasm

# Validate a WebAssembly module in the text format, automatically converting to
# binary.
$ wasm-tools validate foo.wat

# Validate a WebAssembly file enabling an off-by-default feature
$ wasm-tools validate foo.wasm --features=exception-handling

# Validate a WebAssembly file with a default-enabled feature disabled
$ wasm-tools validate foo.wasm --features=-simd

# Print the text format of a module to stdout
$ wasm-tools print foo.wasm

# Convert a binary module to text
$ wasm-tools print foo.wasm -o foo.wat

简单的突变以及将命令组合在一起

# Mutate a WebAssembly module and print its text representation to stdout
$ wasm-tools mutate foo.wasm -t

# Mutate a WebAssembly module with a non-default seed and validate that the
# output is a valid module.
$ wasm-tools mutate foo.wasm --seed 192 | wasm-tools validate

# Demangle Rust/C++ symbol names in the `name` section, strip all other custom
# sections, and then print out what binary sections remain.
$ wasm-tools demangle foo.wasm | wasm-tools strip | wasm-tools objdump

与组件一起工作

# Print the WIT interface of a component
$ wasm-tools component wit component.wasm

# Convert WIT text files to a binary-encoded WIT package, printing the result to
# stdout
$ wasm-tools component wit ./wit -t

# Convert a WIT document to JSON
$ wasm-tools component wit ./wit --json

# Round trip WIT through the binary-encoded format to stdout.
$ wasm-tools component wit ./wit --wasm | wasm-tools component wit

# Convert a core WebAssembly binary into a component. Note that this requires
# WIT metadata having previously been embedded in the core wasm module.
$ wasm-tools component new my-core.wasm -o my-component.wasm

# Convert a core WebAssembly binary which uses WASI to a component.
$ wasm-tools component new my-core.wasm -o my-component.wasm --adapt wasi_snapshot_preview1.reactor.wasm

CLI 习惯用法

所有 CLI 命令都遵循一些约定

  • 所有子命令都使用 -h 打印“简短帮助”,使用 --help 打印“长帮助”。
  • 如果没有指定文件输入,则默认从 stdin 读取输入(当适用时)。
  • 如果没有提供 -o--output 标志,则默认将输出发送到 stdout。然而,默认情况下不将二进制 WebAssembly 打印到 tty。
  • 输出 WebAssembly 二进制的命令都支持 -t--wat 标志以生成 WebAssembly 文本格式。
  • 可以通过传递 -v--verbose 标志来启用工具中的日志消息。可以通过多次传递标志来提高详细程度,例如 -vvv
  • 默认情况下,对于基于 TTY 的输出,错误信息和控制台输出的颜色是启用的,并且可以通过 --color 参数进行配置。

包含的工具

wasm-tools 二进制文件内部包含多个子命令,用于处理 wasm 模块和组件。许多子命令还附带 Rust 包,可以编程方式使用。

命令行界面 Rust 包 沙盒 描述
wasm-tools validate wasmparser 验证 WebAssembly 文件
wasm-tools parse watwast parse 将 WebAssembly 文本格式转换为二进制
wasm-tools print wasmprinter print 将 WebAssembly 二进制格式转换为文本
wasm-tools smith wasm-smith 从输入种子生成有效的 WebAssembly 模块
wasm-tools mutate wasm-mutate 将输入的 wasm 文件转换为新有效的 wasm 文件
wasm-tools shrink wasm-shrink 在保留谓词的同时缩小 wasm 文件
wasm-tools dump 打印关于二进制格式的调试信息
wasm-tools objdump 打印关于节标题的调试信息
wasm-tools strip 从 WebAssembly 文件中删除自定义节
wasm-tools demangle name 节中取消 Rust 和 C++ 符号名称的混淆
wasm-tools compose wasm-compose 将 wasm 组件组合在一起(已弃用)
wasm-tools component new wit-component 从核心 wasm 二进制文件创建组件
wasm-tools component wit 从组件中提取 *.wit 接口
wasm-tools component embed component-type 自定义节嵌入核心 wasm 二进制文件中
wasm-tools metadata show wasm-metadata 在组件或模块中显示名称和生产者元数据
wasm-tools metadata add 向组件或模块添加名称或生产者元数据
wasm-tools metadata unbundle 从组件中提取核心 wasm 模块
wasm-tools addr2line 使用 DWARF 将 wasm 偏移量转换为文件名/行号
wasm-tools completion wasm-tools 生成 shell 完成脚本
wasm-tools json-from-wast *.wast 文件转换为 JSON 命令

wasm-tools 命令行界面包含用于调试 WebAssembly 模块和组件的有用工具。各个子命令都有 --help 解释文本,描述其功能。

如上所述,许多 wasm-tools 命令行界面工具在此存储库中也有库实现。这些库包括

  • wasmparser - 解析 WebAssembly 二进制的库
  • wat - 解析 WebAssembly 文本格式的库
  • wast - 与 wat 类似,但提供了 AST
  • wasmprinter - 以字符串形式打印 WebAssembly 二进制
  • wasm-mutate - 一个 WebAssembly 测试用例变异器
  • wasm-shrink - 一个 WebAssembly 测试用例缩小器
  • wasm-smith - 一个 WebAssembly 测试用例生成器
  • wasm-encoder - 用于生成二进制 WebAssembly 模块的 crate
  • wit-parser - 用于解析和管理 *.wit 文件和接口的 crate。
  • wit-component - 用于从核心 WebAssembly 模块创建组件的 crate。
  • wasm-metadata - 用于操作 WebAssembly 模块或组件中的名称和生产者元数据(自定义部分)的 crate。

建议在嵌入到独立项目时直接使用库,而不是 CLI 工具。

C/C++ 绑定

使用 CMakeLists.txtcrates/c-api 中,可以通过 wasm-tools.h 头文件 使用 wasm-tools。请注意,这些绑定目前并不全面覆盖此存储库的所有功能,但如果您发现某些函数有用,请随时贡献更多内容!

版本控制和发布

此存储库同时具有一个 CLI 和一系列发布到 crates.io(Rust 的包管理器)的 crates。此存储库使用的版本控制方案如下所示

  • wasm-tools - CLI 遵循 1.X.Y 的版本模式。通常 Y 为 0,而 X 作为此存储库发布的部分进行升级。
  • wat - 此 Rust crate 以 1.X.Y 进行版本控制,并与 wasm-tools 版本匹配。
  • wast - 此 Rust crate 以 X.0.Y 进行版本控制。这里的 Xwasm-tools1.X.Y 中的 X 匹配。
  • 所有其他 crates - 此存储库中的所有其他 crates 都以 0.X.Y 进行版本控制,其中 Xwasm-tools1.X.Y 匹配。

请注意,上述所有版本的 Y 都将与该存储库的任何发布版本匹配。这种版本方案旨在反映 CLI 和 watcrate 在 API 稳定性方面的稳定性。然而,其他 crate 都会进行主要版本号的升级,并且这些版本在所有发布版本上都不能自动被认为是 API 兼容的。这反映了 WebAssembly 本身是一个不断发展的标准,而不是一个一成不变的基础。此存储库中的所有 crate 都适合“生产使用”,但请注意,API 稳定性在时间上不能保证。如果您在升级版本时遇到困难,请随时提交一个问题,我们可以提供帮助。

此外,该存储库目前没有严格的发布节奏。发布是根据需要进行的。如果您希望进行发布,请随时在 Zulip 上联系,提交一个问题,在 PR 上留下评论,或以其他方式联系维护者。

对于维护者,发布过程如下

  • 访问 此链接
  • 在 UI 中点击“运行工作流程”。
  • 使用默认的 bump 参数,然后点击“运行工作流程”。
  • 等待 CI 创建 PR。您可以通过“操作”选项卡查看是否出错。
  • 当 PR 打开时,关闭它然后重新打开它。不要提问。
  • 审查 PR,批准它,然后排队合并。

应该就是这样,但请务必关注 CI,以防出现任何问题。

贡献

有关向此存储库贡献的更多信息,请参阅 CONTRIBUTING.md

许可协议

本项目由 Apache 2/ Apache 2 with LLVM exceptions/ MIT 许可证三重许可。这样做的原因是

  • Apache 2/ MIT 在 Rust 生态系统很常见。
  • Apache 2/ MIT 在 Rust 编译器中使用,并且一些代码可能被迁移到那里。
  • 一些代码可能用于编译器输出,Apache 2 with LLVM exceptions 许可证对此很有用。

有关更多详细信息,请参阅

贡献

除非您明确声明,否则您提交给此项目以供包含在内的任何贡献(根据 Apache 2/ Apache 2 with LLVM exceptions/ MIT 许可证定义),应按上述方式许可,不附加任何其他条款或条件。

依赖关系

~9–21MB
~291K SLoC