2 个稳定版本

2.0.0 2021 年 10 月 29 日
1.0.2 2021 年 2 月 6 日

#650WebAssembly


用于 wasmer-wast-asml-fork

MIT 许可证

720KB
15K SLoC

wasmer-wasi 构建状态 加入 Wasmer Slack MIT License crates.io

这个软件包提供了必要的导入,以便从 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")

…还可以使用wasmerwasmer-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