WAPM发布:WebAssembly的包管理器
今天,我们发布了一个新的工具,它将会帮助你在任何地方使用WebAssembly:WAPM(又名WebAssembly Package Manager)
其包括:
Why: 在Wasmer的开发工作中,我们发现开发人员的人机工程学需要显著改进,以便普通用户能够接触到WebAssembly。我们意识到包管理器将有助于解决常见问题,如发布、定义模块ABI、分发可执行二进制文件和使用它们。
What: WebAssembly是一种在具体芯片组指令之上的抽象,这使得WebAssembly可以轻松运行在任何机器上。如果我们进一步推进这种抽象,那么我们就能解锁可以在任何地方运行的通用二进制格式的潜力。对于目标平台为WebAssembly的项目来说,像WASI和Emscripten这样的集成是必要的。
我们的目标是提供一个能够与WebAssembly配套的包管理器,并使得其能简化WebAssembly模块的发布与使用。
你可以观看这个视频来看看wapm
的实战(需要科学上网):Youtube
为什么需要包管理器?
让我们来探讨下为什么包管理器是服务端采用WebAssembly的关键。
角色1:普通用户
首先,我们有一个开发人员的用例,他想使用WebAssembly二进制文件,但不知道如何/在哪里找到它:这可以是nginx、lua、sqlite或任何其他wasm二进制文件。对他们来说,这个过程是这样的:
- 搜索一下,看看在哪里可以找到一个可运行的lua.wasm
wget https://github.com/wasmerio/wasmer/raw/master/examples/lua.wasm
- 试着运行
wasmer run lua.wasm -- -h
角色2:通用二进制文件发布者
我们的第二个角色是一个开发人员,他想要创建一个通用二进制,并在任何机器和操作系统上分发它。这对于命令行工具或者可以直接在Shell中运行的任何东西都很有用:
- 生成wasm文件(使用emcc等工具)
emcc main.c -s WASM=1 # this emits the main.wasm file
- 我应该在哪里发布它?Github?Npm?但这只是WebAssembly,没有JS的关联…那就Github!
git push ...
角色3:通用库发布者
我们还有一个开发人员的用例,他希望用WebAssembly创建通用库,并希望可以在所有语言中使用它们(可以是:Python、PHP、JS、Rust、C与C++…)。
例如,这对于正在创建可以跨任何语言使用的库的开发人员来说是很有用的(比如轻量级嵌入式搜索引擎、人脸检测库、通用GraphQL框架……)。
幸运的是,我们已经为很多语言提供了WebAssembly集成!Python,PHP,Rust,…
所有这些用例促使我们重新思考包管理器的当前全景,以及我们如何创建一个只关注WebAssembly的包管理器,它将统一以下原则:
- 它应该使发布、下载和使用WebAssembly模块变得容易
- 它应该支持在wasm之上定义命令的简单方法
- 它应该允许不同的ABI:WASI,Emscripten,甚至未来的新ABI。
- 它应该可以嵌入到任何语言生态中(Python、PHP、Ruby、JS…),而不会强迫一个生态进入另一个。
NPM
Node.js软件包管理器非常棒,在托管WebAssembly模块方面拥有最多的经验(因为WebAssembly是JavaScript生态系统的种子)。
然而,我们觉得服务器端的WebAssembly是一个全新的使用场景,因此它应该有一个从WebAssembly的精髓中塑造出来的包管理器,并从JavaScript生态中解放出来。
注意:虽然我们认为从JavaScript中使用WebAssembly是一个很好的使用方式,但是我们也希望并且鼓励在Python、PHP、Rust、…等语言中使用WebAssembly。