16个版本 (10个破坏性更新)
0.13.2+wasi-0.2.1 | 2024年8月12日 |
---|---|
0.13.1+wasi-0.2.0 | 2024年5月20日 |
0.13.0+wasi-0.2.0 | 2024年3月12日 |
0.11.0+wasi-snapshot-prev… | 2022年1月19日 |
0.0.0 | 2019年3月27日 |
#105 in WebAssembly
6,063,853 每月下载量
用于 41,261 个软件包 (32个直接使用)
1MB
15K SLoC
本库包含针对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