16个版本 (10个破坏性更新)

0.13.2+wasi-0.2.12024年8月12日
0.13.1+wasi-0.2.02024年5月20日
0.13.0+wasi-0.2.02024年3月12日
0.11.0+wasi-snapshot-prev…2022年1月19日
0.0.0 2019年3月27日

#105 in WebAssembly

Download history 1233777/week @ 2024-05-03 1299805/week @ 2024-05-10 1328659/week @ 2024-05-17 1302705/week @ 2024-05-24 1470552/week @ 2024-05-31 1439719/week @ 2024-06-07 1386942/week @ 2024-06-14 1476422/week @ 2024-06-21 1352554/week @ 2024-06-28 1392065/week @ 2024-07-05 1456391/week @ 2024-07-12 1487817/week @ 2024-07-19 1479929/week @ 2024-07-26 1440679/week @ 2024-08-02 1551878/week @ 2024-08-09 1310879/week @ 2024-08-16

6,063,853 每月下载量
用于 41,261 个软件包 (32个直接使用)

Apache-2.0…

1MB
15K SLoC

wasi

一个 Bytecode Alliance 项目

WASI API绑定库

Crates.io version Download docs.rs docs

本库包含针对WASI API的绑定库,用于世界各地的

本库是通过从WIT文件生成,使用wit-bindgen

使用方法

可以通过将其添加到依赖项中来实现对这个库的使用

$ cargo add wasi

然后您可以使用模块根目录中的API,如下所示

fn main() {
    let stdout = wasi::cli::stdout::get_stdout();
    stdout.blocking_write_and_flush(b"Hello, world!\n").unwrap();
}

本库旨在针对组件,但今天您需要通过使用wasm32-wasip1目标进行核心WebAssembly模块的中间构建步骤

$ cargo build --target wasm32-wasip1

接下来,您需要一个“适配器”来将Rust标准库对wasi_snapshot_preview1的使用转换为组件模型。一个示例适配器可以在Wasmtime的发布页面中找到。

$ curl -LO https://github.com/bytecodealliance/wasmtime/releases/download/v17.0.0/wasi_snapshot_preview1.command.wasm

接下来,您将使用wasm-tools CLI来创建组件

$ cargo install wasm-tools
$ wasm-tools component new target/wasm32-wasip1/debug/foo.wasm \
    --adapt ./wasi_snapshot_preview1.command.wasm \
    -o component.wasm

最后,组件可以由支持组件模型的运行时运行,例如Wasmtime

$ wasmtime run component.wasm
Hello, world!

WASIp2与WASIp1

2024年1月,WASI小组发布了WASI 0.2.0,俗称“WASIp2”。在同一时间,小组还决定将之前的WASI版本命名为“WASIp1”,历史上称为“WASI preview1”。这个现在已成为历史的WASI快照使用了一套完全不同的原语,并且工作方式非常不同。这个库现在针对WASIp2,不再针对WASIp1。

对WASIp1的支持

支持WASIp1的最后一个版本是wasi软件包的0.11.0+wasi-snapshot-preview1版本。这个版本的软件包支持所有WASIp1 API。WASIp1历史上是用*.witx文件定义的,并使用了一个名为witx-bindgen的绑定生成器。

我应该使用WASIp1还是WASIp2?

这是一个有点复杂的问题/答案,但简短的回答是,如果你不确定,现在可能应该使用wasi的0.11.0版本。

更详细的回答是,这取决于你想要支持的Rust目标。Rust WebAssembly目标包括

  • wasm32-unknown-unknown - 不要使用这个软件包,因为这个目标表示不需要WASI。
  • wasm32-wasip1 - 这个目标在Rust中已经存在了一段时间,之前被称为wasm32-wasi。对于这个目标,你可能希望使用这个软件包的0.11.0版本。
  • wasm32-wasip2 - 这个目标是rustc的一个较新添加,截至本文撰写时尚未合并到rustc中。这个软件包的0.12.0版本是为这个目标设计的。

请注意,如果你使用wasm32-wasip1,并不一定保证你需要这个软件包的0.11.0版本。如果你的用户正在生成组件,你可能希望使用0.12.0版本。如果你不知道你的用户正在生成什么,你可能应该坚持使用0.11.0版本。

简而言之,这有点复杂。我们正处于从WASIp1到WASIp2的过渡期,每一步都不会完美,所以理解是受欢迎的!

开发

wasi软件包的大部分是由wit-bindgen工具生成的。可以使用以下方式重新生成src/bindings.rs文件

$ ./ci/regenerate.sh

WASI定义位于本存储库的wit目录中。目前它们是从上游存储库复制的,但希望将来能更好地管理。

许可证

本项目受Apache 2/Apache 2(带LLVM异常)/MIT许可证的三重许可。这样做的原因是

  • Apache 2/MIT在Rust生态系统中很常见。
  • Apache 2/MIT用于Rust标准库中,并且可能有一些代码会迁移到那里。
  • 一些代码可能用于编译器输出,而Apache 2(带LLVM异常)许可证对此很有用。

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

贡献

除非你明确声明,否则你提交给本项目以供包含的任何贡献,根据Apache 2/Apache 2(带LLVM异常)/MIT许可证定义,均应按上述方式许可,无需任何附加条款或条件。

依赖关系

~83–310KB