运行 .mbtx 脚本#

Moon 构建系统支持直接编写 MoonBit 脚本,无需模块或包配置文件。脚本文件使用 .mbtx 扩展名。

运行 .mbtx 文件#

编写脚本 script.mbtx

///|
import {
  "moonbitlang/core/list" @ls
}

///|
async fn main {
  let xs = @ls.List(["1", "2", "3"])
  debug(xs)
}

然后直接运行该脚本:

$ moon run script.mbtx

.mbtx 中,你可以在文件顶部声明导入,语法与包配置相同。不同之处在于:导入路径可以在模块名后可选地包含版本 @version

///|
import {
  "moonbitlang/async@0.20.2/fs",
  "moonbitlang/async@0.20.2",
}

///|
async fn main {
  ...
}

来自同一模块的所有导入包必须使用相同版本。

如果导入路径没有显式指定版本,则会使用本地索引中的最新版本。

脚本可以在导入后添加 *,将该包中的所有定义引入当前作用域。还可以用 @alias 为该导入设置自定义包别名:

///|
import {
  "moonbitlang/core/queue" @q *
}

///|
fn main {
  let queue = Queue([1, 2, 3])
  println(queue.length())
  let qualified = @q.Queue([4, 5])
  println(qualified.length())
}

包别名仍然可用,因此示例可以同时使用 Queue@q.Queue。未显式指定 @alias 时,使用包的默认别名。全量导入语法仅限 .mbtx 脚本;普通包应使用包别名或 using 声明。当名称冲突会让脚本难以阅读时,优先使用显式导入。

测试 .mbtx 脚本#

将脚本路径传给 moon test,即可单独测试该脚本:

moon test script.mbtx

脚本必须定义 fn main,但生成的测试入口不会运行它。即使脚本位于项目内,显式传入 .mbtx 路径也只会测试该脚本;反过来,对整个包运行测试时不会包含 .mbtx 脚本。

从 stdin 运行 .mbtx 脚本#

Moon 支持从 stdin 运行 .mbtx 脚本:

$ cat script.mbtx | moon run -

对于简短脚本,可以使用 -c 直接传入 .mbtx 源码:

$ moon run -c "<script>"
$ moon run -c 'fn main { println("hello") }'

你也可以使用 heredoc(由 shell 提供的一项功能):

$ moon run - <<EOF
fn main {
  println("hello")
}
EOF