扩展开发

扩展开发

扩展开发

功能

BT 扩展系统用于把项目目录中的 .bts 扩展包加载到当前 VM。扩展包放在项目根目录的 extensions/ 下,启动时按文件名顺序扫描,校验 manifest.jsonbindings.json 后,把公开入口注入到用户全局环境。

当前版本处于扩展系统开发阶段:已经完成 .bts 包校验、扩展注册表、VM 全局入口注入、扩展函数值、扩展对象值、对象方法分发和 kind=bt / bts-bt-1 纯 BT Runner。kind=wasm / bts-wasi-1 执行后端仍在后续开发中。

语法

项目结构:

脚本中直接调用扩展公开入口:

参数

扩展入口和方法的参数由扩展包内 bindings.json 声明。

bindings.json 第一版支持的参数类型:

参数 role 当前用于声明宿主侧预处理语义:

路径角色会校验扩展 manifest 中对应的文件权限声明;真实路径转换和 WASI 预打开目录会在后续路径阶段完成。

返回值

扩展入口可以返回普通 BT 数据,也可以返回扩展对象。扩展对象的方法继续通过点号链式调用。

扩展入口属于用户全局环境:

代码示例

示例 manifest.json

示例 bindings.json

示例 src/lib.bt

BT 调用:

注意事项

  • 当前构建必须启用 extensions feature 才能加载项目 extensions/ 目录;未启用时,如果项目存在 extensions/,启动会报错。
  • 扩展入口注入后是全局常量,脚本不能重新赋值。
  • env('calc') 可以读取扩展入口,has_env('calc') 返回 true
  • envs('calc')has_envs('calc') 只表示系统函数和系统常量,不会把扩展入口当作系统能力。
  • 纯 BT 扩展加载阶段只解析、校验和编译入口源码,不会执行入口顶层代码。
  • 纯 BT 入口顶层只允许 fnclass、空语句和大写常量的字面量初始化;不要在顶层写 include、普通赋值、循环、I/O 调用、returnthrow
  • 纯 BT 扩展返回 bindings 对象类型时,应返回普通对象或类实例;对象方法由 Runner 内部 VM 执行。
  • kind=wasm 扩展包可以通过 manifest/bindings 校验,但当前版本尚未实现 WASM Runner,调用时会报错。
  • 扩展对象第一版不支持进入 task() 快照。