moonbitlang/x 现已支持文件 I/O

最近社区对于在 MoonBit 中进行文件 IO 的呼声很高,为此,我们在 moonbitlang/x 中提供了一个基础的 fs 包,moonbitlang/x/fs 包支持 wasm, wasm-gc, js 后端,包含以下常用 api:(注:此库目前是实验性的,其 api 可能会有进一步的更新和调整。)

  • write_string_to_file, write_bytes_to_file
  • read_file_to_string, read_file_to_bytes
  • path_exists
  • read_dir
  • create_dir
  • is_dir, is_file
  • remove_dir, remove_file

用法示例

  • 声明依赖

在命令行中执行以下命令

moon update
moon add moonbitlang/x

或者手动在 moon.mod.json 中声明依赖

"deps": {
    "moonbitlang/x": "0.4.10"
}
  • 在需要使用的包中的 moon.pkg.json 导入依赖
"import": [
    "moonbitlang/x/fs"
]
test "write_and_read" {
  let path = "1.txt"
  // write content to the file
  @fs.write_string_to_file(
    path="1.txt",
    content=
      #|target/
      #|.mooncakes/
      #|
    ,
  )
  // make sure the file has been create
  assert_true!(@fs.path_exists(~path))
  let byte = @fs.read_file_to_bytes!(~path)
  // verify file content
  inspect!(
    byte,
    content=
      #|b"\x74\x61\x72\x67\x65\x74\x2f\x0a\x2e\x6d\x6f\x6f\x6e\x63\x61\x6b\x65\x73\x2f\x0a"
    ,
  )
  @fs.remove_file!(~path)
  assert_false!(@fs.path_exists(~path))
  try {
    @fs.read_file_to_string!(~path) |> ignore
  } catch {
    @fs.IOError::NotFound(_) as e =>
      inspect!(e, content="`1.txt` does not exist")
    _ => return
  }
  let bytes = Bytes::from_array([65, 97].map(fn(x) { x.to_byte() }))
  @fs.write_bytes_to_file(~path, content=bytes)
  assert_true!(@fs.path_exists(~path))
  let content = @fs.read_file_to_string!(~path)
  inspect!(content, content="Aa")
  @fs.remove_file!(~path)
  assert_false!(@fs.path_exists(~path))
  try {
    @fs.remove_file!(~path) |> ignore
  } catch {
    @fs.IOError::NotFound(_) as e =>
      inspect!(e, content="`1.txt` does not exist")
    _ => return
  }
}

更多示例可参见 fs/fs_test.mbt,这个文件是对于 fs 库的黑盒测试,其中的 test case 直观地展示了外部用户应该如何该库。

Background:MoonBit 项目的测试机制

目前一个 MoonBit 项目中可以有三种类型的测试:白盒测试(white box test)、黑盒测试(black box test)、内部测试(inline test)。

白盒测试

写在 *_wbtest.mbt中,构建系统会把当前包中的 *.mbt*_wbtest.mbt 一起打包编译,因此在 *_wbtest.mbt 中可以访问当前包的私有成员,这些测试可以使用 moon.pkg.json 中 import 和 wbtest-import 字段中的依赖。wbtest-import 只在白盒测试中用到,不会打包到最终的构建产物中。

黑盒测试

写在 *_test.mbt 中,构建系统会在编译 *_test.mbt 时会自动将其所在的包作为依赖, *_test.mbt 只能访问其所在包的公开成员(即模拟外部用户在使用这个包时的视角),这些测试可以使用 moon.pkg.json 中的 importtest-import 字段中的依赖(以及其所在包,不需要显式写在 test-import 字段中)。test-import 只在黑盒测试中用到,不会打包到最终的构建产物中。

内部测试

可以直接写在 *.mbt​(注意这里的*.mbt 不包含上面提到的 *_wbtest.mbt*_test.mbt​)中,可以访问当前包的私有成员,这些测试只使用 moon.pkg.json 中 import 字段中的依赖。

测试类型文件拓展名访问权限依赖来源打包到最终产物
白盒测试*_wbtest.mbt当前包私有成员moon.pkg.json import & wbtest-import
黑盒测试*_test.mbt公有成员moon.pkg.json import & test-import
内部测试*.mbt当前包私有成员moon.pkg.json import

Moonbit
1 声望3 粉丝

IDEA基础软件中心打造的下一代智能开发平台