使用 rakudo-star 加载 Raku 模块的正确方法是什么?

What is the proper way to load Raku modules using rakudo-star?

我有以下项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tree
.
├── lib
│ └── MyModule.raku
└── main.raku

$ cat lib/MyModule.raku
use v6;
unit module MyModule;
sub hello { say 'hello' }

$ cat lib/main.raku
use v6;
use MyModule;
MyModule.hello();

我想使用最新的 rakudo-star 映像运行 main.raku。但是会发生以下情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ docker run -i --rm -u $(id -u) \\
--workdir /work \\
--volume  $PWD:/work \\
--entrypoint bash \\
rakudo-star perl6 -I ./lib main.raku
===SORRY!===
Could not find MyModule at line 3 in:
    file#/work/lib
    inst#/.perl6
    inst#/usr/share/perl6/site
    inst#/usr/share/perl6/vendor
    inst#/usr/share/perl6
    ap#
    nqp#
    perl5#

我也尝试在 main.raku 中的 use MyModule 之前插入 use lib '/work/lib',结果相同。


有几个问题。

  • 模块不以 .raku 结尾。它们以 .rakumod.pm6 结尾(暂时)。
    (从技术上讲,安装后,只要您在 META6.json 中正确声明了扩展名,它实际上并不重要。)

  • 默认情况下(my)子程序是词法范围的,并且默认情况下也不导出。
    所以没有办法在它定义的模块之外访问 hello()

  • 模块没有方法,因此您不能将 hello 作为方法调用。
    即使他们确实有方法,他们也不会以 sub 关键字开头。

  • 你可以用 our:

    全局作用域子程序

    lib/MyModule.rakumod

    1
    2
    3
    4
    5
    6
    7
    use v6.d;
    unit module MyModule;

    our sub hello () { say 'hello' }
    #^
    # \\
    #  globally scoped

    main.raku

    1
    2
    3
    4
    5
    6
    7
    8
    use v6.d;
    # use lib './lib';
    use module MyModule;

    MyModule::hello();
    #       ^^
    #        \\
    #         namespace delimiter

    您可以改为导出它:

    lib/MyModule.rakumod

    1
    2
    3
    4
    5
    6
    7
    8
    use v6.d;
    unit MyModule;

    #             mark for export
    #            v-------v
    sub hello () is export {
        say 'hello'
    }

    main.raku

    1
    2
    3
    4
    5
    use v6.d;
    # use lib './lib';
    use MyModule;

    hello();

    除了is export,还有其他更细粒度的导出方式。

    如果您要导出,我建议您也使用 our 使其全局化。这样,如果有人使用您的模块,但不想导入您的潜艇;他们仍然可以访问它们。


    新的 Raku 版本使用 .rakumod 作为模块的文件扩展名。旧的 .pm6 扩展仍然受支持。有关新文件扩展名的更多信息,请参阅 Path-to-Raku 票证。有关模块的更多信息,请参阅 raku 文档。