bri*_*foy 12 module perl6 raku
在Bar.pm中,我声明了一个具有权限(作者)和版本的类:
class Bar:auth<Camelia>:ver<4.8.12> {
}
Run Code Online (Sandbox Code Playgroud)
如果我在程序中使用它,我如何查看我正在使用的模块版本,编写者以及模块加载器如何找到它?与往常一样,文档链接很重要.
这个问题也被问到perl6用户,但在出现满意答案(或文档链接)之前就已经死了.
这个问题的另一个问题是许多人没有将这些信息添加到他们的类或模块定义中.它显示在META.json文件中,但不显示在代码中.
sml*_*mls 12
(可能不是一个令人满意的答案,因为事情的事实不是很令人满意,特别是关于文档的状态,但在这里......)
如果模块或类直接在源代码àla中版本化class Bar:auth<Camelia>:ver<4.8.12>
,那么导入它的任何代码都可以内省它:
use Bar;
say Bar.^ver; # v4.8.12
say Bar.^auth; # Camelia
# ...which is short for:
say Bar.HOW.ver(Bar); # v4.8.12
say Bar.HOW.auth(Bar); # Camelia
Run Code Online (Sandbox Code Playgroud)
这些ver
和auth
方法由以下提供:
Metamodel::ClassHOW
(虽然那个文档页面还没有提到它们)Metamodel::ModuleHOW
(虽然该文档页面根本不存在)不幸的是,我不认为元对象目前提供了一种获取模块/类的源路径的方法.
通过该步骤手动去use
并require
采取加载编译单元,你至少可以在前缀路径获取(即从哪个位置$PERL6LIB
或者use lib
或者-I
等它从加载):
my $comp-spec = CompUnit::DependencySpecification.new: short-name => 'Bar';
my $comp-unit = $*REPO.resolve: $comp-spec;
my $comp-repo = $comp-unit.repo;
say $comp-repo.path-spec; # file#/home/smls/dev/lib
say $comp-repo.prefix; # "/home/smls/dev/lib".IO
Run Code Online (Sandbox Code Playgroud)
$comp-unit
是一个类型的对象CompUnit
.
$comp-repo
是一个CompUnit::Repository::FileSystem
.
两个文档页面尚不存在,$*REPO
仅在动态变量列表中简要提及.
如果模块是正确设置的发行版的一部分,您可以获取其中定义的元信息META6.json
(由Lloyd Fournier在您提到的邮件列表线程中发布):
if try $comp-unit.distribution.meta -> %dist-meta {
say %dist-meta<ver>;
say %dist-meta<auth>;
say %dist-meta<license>;
}
Run Code Online (Sandbox Code Playgroud)