62 个版本 (15 个稳定版)
3.2.0-alpha.1 | 2023年1月23日 |
---|---|
3.1.0 | 2022年12月14日 |
3.0.2 | 2022年11月27日 |
3.0.0-alpha.4 | 2022年7月29日 |
0.5.7 | 2019年7月23日 |
#263 in WebAssembly
15,560 每月下载量
用于 22 个 crates(17 个直接使用)
2MB
37K SLoC
wasmer-wasi
此 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")
……以及使用 wasmer
和 wasmer-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