62 个版本 (15 个稳定版)

3.2.0-alpha.12023年1月23日
3.1.0 2022年12月14日
3.0.2 2022年11月27日
3.0.0-alpha.42022年7月29日
0.5.7 2019年7月23日

#263 in WebAssembly

Download history 6479/week @ 2024-03-03 7926/week @ 2024-03-10 7051/week @ 2024-03-17 6066/week @ 2024-03-24 4963/week @ 2024-03-31 4324/week @ 2024-04-07 7228/week @ 2024-04-14 5739/week @ 2024-04-21 4281/week @ 2024-04-28 7117/week @ 2024-05-05 3126/week @ 2024-05-12 4762/week @ 2024-05-19 4107/week @ 2024-05-26 5177/week @ 2024-06-02 3335/week @ 2024-06-09 2771/week @ 2024-06-16

15,560 每月下载量
用于 22 个 crates(17 个直接使用)

MIT 许可证

2MB
37K SLoC

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

此 crate 提供了从 Wasmer 运行时轻松使用 WASI 所必需的导入。WebAssembly 系统接口(简称 WASI)是 WebAssembly 的模块化系统接口。WASI 正在 WebAssembly 小组中进行标准化。

非常简而言之,从用户的角度来看,WASI 是一组位于特定 命名空间(根据 WASI 版本而有所不同)下的 WebAssembly 模块 导入。为 wasm32-wasi 目标编译的程序将能够支持标准 I/O、文件 I/O、文件系统操作、内存管理、时间、字符串、环境变量、程序启动等。

Wasmer WASI 的创建目的是完全沙箱化。我们能够实现这一点,归功于我们的虚拟文件系统实现(wasmer-vfs)以及只允许安全的系统调用返回到宿主。

注意:如果您遇到任何沙箱问题,请在 wasmer 仓库中提交问题 https://github.com/wasmerio/wasmer

此 crate 提供了通过我们的 ImportObject API 创建导入以从 Wasmer 运行时轻松使用 WASI 所必需的 API。

支持的 WASI 版本

WASI 版本 支持
wasi_unstable
wasi_snapshot_preview1

特殊的 Latest 版本指向 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 mut 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 mut wasi_thread = wasi_env.new_thread();
let import_object = wasi_thread.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)。

依赖项

~7–17MB
~263K SLoC