提问人:Chris W 提问时间:2/6/2023 最后编辑:Chris W 更新时间:2/8/2023 访问量:333
服务器端 AssemblyScript:如何读取文件?
Server-side AssemblyScript: How to read a file?
问:
我想编写一些服务器端 AssemblyScript,它使用 WASI 接口来读取文件并处理内容。
我知道 AssemblyScript 和 ByteCode 联盟最近因为 WASI 标准的“开放性”而闹翻了,但我希望他们仍然能很好地合作......
我发现有几个 AssemblyScript 工具/库似乎可以弥合这一差距,而似乎最容易使用的是 as-wasi
。按照安装说明进行操作后,我只是尝试运行这个小演示应用程序。
所有 VSCode 设计时错误都已消失,但 AssemblyScript 编译器仍然在初始语句处出现 barf。import
import "wasi"
import { Console, Environ } from "as-wasi/assembly";
// Create an environ instance
let env = new Environ();
// Get the HOME Environment variable
let home = env.get("HOME")!;
// Log the HOME string to stdout
Console.log(home);
跑步会给。npm run asbuild
$ npm run asbuild
> [email protected] asbuild
> npm run asbuild:debug && npm run asbuild:release
> [email protected] asbuild:debug
> asc assembly/index.ts --target debug
ERROR TS6054: File '~lib/wasi.ts' not found.
:
1 │ import "wasi"
│ ~~~~~~
└─ in assembly/index.ts(1,8)
FAILURE 1 parse error(s)
该文件不存在,将此文件创建为指向 in 目录的软链接没有区别。~lib/wasi.ts
index.ts
./node_modules/as-wasi/assembly/
由于库是调用而不是调用的,我尝试导入,但这也失败了。as-wasi
wasi
as-wasi
我也尝试过适应包括tsconfig.json
{
"extends": "assemblyscript/std/assembly.json",
"include": [
"../node_modules/as-wasi/assembly/*.ts",
"./**/*.ts"
]
}
但这也没有影响。
是什么导致认为所需的库应该在调用的目录中,我应该如何将其指向正确的位置?asc
~lib/
谢谢
答:
你的问题让我有点兔子洞,但我想我解决了它。
因此,显然,在 wasi 分裂之后,AssemblyScript 添加了 wasi-shim 存储库,您也必须安装该存储库:
npm install --save wasi-shim
根据同一页面,在 AssemblyScript 版本 0.20 之后不再需要 ,因此您必须完全删除该导入。另外,请务必按照同一页面中的建议将 添加到您的 中。我的看起来像这样:import "wasi"
extends
asconfig.json
wasi-shim
{
"extends": "./node_modules/@assemblyscript/wasi-shim/asconfig.json",
"targets": {
"debug": {
"outFile": "build/debug.wasm",
"textFile": "build/debug.wat",
"sourceMap": true,
"debug": true
},
"release": {
"outFile": "build/release.wasm",
"textFile": "build/release.wat",
"sourceMap": true,
"optimizeLevel": 3,
"shrinkLevel": 0,
"converge": false,
"noAssert": false
}
},
"options": {
"bindings": "esm"
}
}
它只是生成的原始加那个.asconfig.json
extends
现在事情变得有趣了。我收到编译错误:
ERROR TS2300: Duplicate identifier 'wasi_abort'.
:
1100 │ export function wasi_abort(
│ ~~~~~~~~~~
└─ in ~lib/as-wasi/assembly/as-wasi.ts(1100,17)
:
19 │ export function wasi_abort(
│ ~~~~~~~~~~
└─ in ~lib/wasi_internal.ts(19,17)
所以我调查了一下,似乎导出的符号与导出的符号相同。没什么大不了的,我进入了 ,并将该函数重命名为 。我也通过函数的调用来做到这一点,即在 from 中找到的三个实例:as-wasi
wasi_shim
node_modules/as-wasi/
as_wasi_abort
package.json
as-wasi
{
"asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --use abort=as_wasi_abort --debug",
"asbuild:small": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --use abort=as_wasi_abort -O3z ",
"asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --use abort=as_wasi_abort -O3",
}
做完这一切后,编译的软件包和 Wasm By Example 中的示例终于起作用了。
您的代码现在应该编译,我将尝试向所有必要的地方发出拉取请求,以便更新示例,更新代码,这样就没有人需要再次执行此操作。如果还有其他问题,请发表评论。as-wasi
编辑:看来我对功能是一个问题的看法是正确的。它实际上已在存储库中删除,但 npm 包已过时。我在拉取请求中要求更新它。wasi_abort
as-wasi
评论