包系统
Erg包大致可以分为app包,即应用程序,以及lib包,即库
应用包的入口点是src/app.er
。app.er
中定义的main
函数被执行
lib 包的入口点是src/lib.er
。导入包相当于导入 lib.er
一个包有一个称为模块的子结构,在 Erg 中是一个 Erg 文件或由 Erg 文件组成的目录。外部 Erg 文件/目录是作为模块对象的可操作对象
为了将目录识别为模块,有必要在目录中放置一个"(目录名称).er"文件
这类似于 Python 的 __init__.py
,但与 __init__.py
不同的是,它放在目录之外
例如,考虑以下目录结构
└─┬ ./src
├─ app.er
├─ foo.er
├─ bar.er
└─┬ bar
├─ baz.er
└─ qux.er
您可以在 app.er
中导入 foo
和 bar
模块。由于 bar.er
文件,bar
目录可以被识别为一个模块
foo
模块是由文件组成的模块,bar
模块是由目录组成的模块。bar
模块还包含 baz
和 qux
模块
该模块只是 bar
模块的一个属性,可以从 app.er
访问,如下所示
# app.er
foo = import "foo"
bar = import "bar"
baz = bar.baz
# or `baz = import "bar/baz"`
main args =
...
请注意用于访问子模块的 /
分隔符。这是因为可以有诸如 bar.baz.er
之类的文件名
不鼓励使用此类文件名,因为 .er
前缀在 Erg 中是有意义的
例如,用于测试的模块。以 .test.er
结尾的文件是一个(白盒)测试模块,它在运行测试时执行一个用 @Test
修饰的子例程
└─┬ ./src
├─ app.er
├─ foo.er
└─ foo.test.er
./src
```python
# app.er
foo = import "foo"
main args =
...
此外,以 .private.er 结尾的文件是私有模块,只能由同一目录中的模块访问
└─┬
├─ foo.er
├─ bar.er
└─┬ bar
├─ baz.private.er
└─ qux.er
# foo.er
bar = import "bar"
bar.qux
bar.baz # AttributeError: module 'baz' is private
# qux.er
baz = import "baz"