moonbit 多包多文件样例

1. 先创建一个项目

$ moon new example

2. 按照如下目录结构创建文件夹与文件

.
├── main
│   ├── a.mbt
│   ├── main.mbt
│   └── moon.pkg
├── moon.mod
└── pkg
    ├── lib.mbt
    └── moon.pkg
  1. main/a.mbt
pub func f() {
  "a\n".print()
}

  1. main/main.mbt
func init {
  "Hello, world!\n".print()
  f()
  @pkg.g()
}
  1. main/main.pkg
package main

import "example/pkg"

  1. moon.mod
module "example"
  1. pkg/lib.mbt
pub func f() {
  "pkg\n".print()
}


  1. pkg/moon.pkg

3. 最后执行 moon run

$ moon run  
Hello, world!
a
pkg
2 个赞

把包定义文件和源代码文件分开的设计, 看起来有点奇怪, 能解释一下为什么这么设计嘛 ?

1 个赞

目前的设计是每个包共享一个 moon.pkg 文件,这样在处理包之间的依赖关系的时候可以只读取、解析一个文件,对于大型项目可以节省很多构建时间。

后续我们会在 IDE 中改善体验。

2 个赞

关于月兔的 包 (package), 模块 (module) 术语与 js, rust 不一致的问题:

  • js 的模块是单个源文件, 包基本上是 npm 的包

  • rust 的模块是单个文件, 文件的一部分, 或一个目录, crate 是较大的单位 (类似于 js 的包)

js 和 rust 的模块都是较小的单位, “包” 是相对较大的单位.

而月兔正好相反, 包 是较小的单位, 而 模块 是相对较大的单位.

如果之前主要使用的编程语言是 js 或 rust, 那么入手月兔的时候, 看到这里就会比较晕.
我就是看了半天才明白.

建议月兔把 “模块” 换成别的术语, 容易导致误解.

  • 模块(Module)是WebAssembly标准里的概念术语,不宜更换的:) 对熟悉Js的来说对标Js模块概念。

    WebAssembly 关键概念 模块 Module

  • 对习惯Js、Rus等等的人来说,Moonbit引入的包概念从“单位大小”上感觉是相反的:) Java的包概念?
    • 个人更倾向于包是更大的单位;
    • 项目依赖的子模块组织到lib目录或其各个子目录,主模块组织到main目录中,模块相关元信息记录在各自的moon.mod.json文件中;
    • 项目根目录使用moon.pkg.json文件记录相关元信息,或者其他文件命名。
1 个赞

目前的模块与包的概念、包括项目的目录结构组织与Go类似

1 个赞