服务器端 AssemblyScript:如何读取文件?

Server-side AssemblyScript: How to read a file?

提问人:Chris W 提问时间:2/6/2023 最后编辑:Chris W 更新时间:2/8/2023 访问量:333

问:

我想编写一些服务器端 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.tsindex.ts./node_modules/as-wasi/assembly/

由于库是调用而不是调用的,我尝试导入,但这也失败了。as-wasiwasias-wasi

我也尝试过适应包括tsconfig.json

{
  "extends": "assemblyscript/std/assembly.json",
  "include": [
    "../node_modules/as-wasi/assembly/*.ts",
    "./**/*.ts"
  ]
}

但这也没有影响。

是什么导致认为所需的库应该在调用的目录中,我应该如何将其指向正确的位置?asc~lib/

谢谢

服务器端 程序集脚本 wasi

评论


答:

1赞 TachyonicBytes 2/8/2023 #1

你的问题让我有点兔子洞,但我想我解决了它。

因此,显然,在 wasi 分裂之后,AssemblyScript 添加了 wasi-shim 存储库,您也必须安装该存储库:

npm install --save wasi-shim

根据同一页面,在 AssemblyScript 版本 0.20 之后不再需要 ,因此您必须完全删除该导入。另外,请务必按照同一页面中的建议将 添加到您的 中。我的看起来像这样:import "wasi"extendsasconfig.jsonwasi-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.jsonextends

现在事情变得有趣了。我收到编译错误:

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-wasiwasi_shimnode_modules/as-wasi/as_wasi_abortpackage.jsonas-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_abortas-wasi

评论

0赞 Chris W 2/9/2023
感谢您深入了解这一点。这有点痛苦,但它现在可以编译和运行