2 个稳定版本
2.0.0 | 2021 年 10 月 29 日 |
---|---|
1.0.2 | 2021 年 2 月 6 日 |
#650 在 WebAssembly
720KB
15K SLoC
wasmer-wasi
这个软件包提供了必要的导入,以便从 Wasmer 中轻松使用 WASI。 WebAssembly 系统接口 (简称 WASI) 是一个模块化系统接口,用于 WebAssembly。WASI 正在 WebAssembly 小组中进行标准化。
从用户的角度来看,WASI 是一组位于特定 命名空间(根据 WASI 版本而异)下的 WebAssembly 模块 导入(简称为 WASI)。针对 wasm32-wasi
目标编译的程序将能够支持标准 I/O、文件 I/O、文件系统操作、内存管理、时间、字符串、环境变量、程序启动等。
此软件包通过我们的 ImportObject
API 提供必要的 API,以便轻松地从 Wasmer 运行时创建导入以使用 WASI。
支持的 WASI 版本
WASI 版本 | 支持 |
---|---|
wasi_unstable |
✅ |
WASI快照预览1 |
✅ |
特殊版本的最新
指向wasi_snapshot_preview1
。
了解更多关于WASI版本流程(临时、快照、旧版本)。
用法
让我们考虑以下hello.rs
Rust程序
fn main() {
println!("Hello, {:?}", std::env::args().nth(1));
}
然后,让我们编译它为具有WASI支持的WebAssembly模块
$ rustc --target wasm32-wasi hello.rs
最后,让我们使用wasmer
CLI来执行它
$ wasmer run hello.wasm Gordon
Hello, Some("Gordon")
…还可以使用wasmer
和wasmer-wasi
库编程执行
use wasmer::{Store, Module, Instance};
use wasmer_wasi::WasiState;
let store = Store::default();
let module = Module::from_file(&store, "hello.wasm")?;
// Create the `WasiEnv`.
let wasi_env = WasiState::new("command-name")
.args(&["Gordon"])
.finalize()?;
// Generate an `ImportObject`.
let import_object = wasi_env.import_object(&module)?;
// Let's instantiate the module with the imports.
let instance = Instance::new(&module, &import_object)?;
// Let's call the `_start` function, which is our `main` function in Rust.
let start = instance.exports.get_function("_start")?;
start.call(&[])?;
查看使用WASI的完整示例。
更多资源
这个库是关于Wasmer运行时内部的WASI实现。它包含了关于实现本身的文档。但是,如果您想了解更多关于WASI的信息,这里有一些可能帮助您的链接列表
wasi-libc
,WASI系统调用的WebAssembly程序之上的WASI libc实现。它提供了一系列POSIX兼容的C API,包括对标准I/O、文件I/O、文件系统操作、内存管理、时间、字符串、环境变量、程序启动和其他许多API的支持wasi-sdk
,基于wasi-libc
的WASI启用WebAssembly C/C++工具链- WASI API文档,
- WASI C API头文件,
- WASI应用程序二进制接口(ABI),例如,我们了解
_start
和_initialize
(对于reactors)。
依赖项
~8–17MB
~235K SLoC