在 Bar.pm,我声明一个具有权限(作者)和版本的类:
class Bar:auth<Camelia>:ver<4.8.12> {
}
如果我在程序中使用它,我如何查看我正在使用的模块版本,编写者以及模块加载器如何找到它?与往常一样,文档链接很重要。
这个问题也被问到了 perl6用户 但在出现令人满意的答案(或文档链接)之前死亡。
这个问题的另一个问题是许多人没有将这些信息添加到他们的类或模块定义中。它显示在 META.json 文件,但不是代码。
在 Bar.pm,我声明一个具有权限(作者)和版本的类:
class Bar:auth<Camelia>:ver<4.8.12> {
}
如果我在程序中使用它,我如何查看我正在使用的模块版本,编写者以及模块加载器如何找到它?与往常一样,文档链接很重要。
这个问题也被问到了 perl6用户 但在出现令人满意的答案(或文档链接)之前死亡。
这个问题的另一个问题是许多人没有将这些信息添加到他们的类或模块定义中。它显示在 META.json 文件,但不是代码。
(可能不是一个令人满意的答案,因为事情的事实不是很令人满意,特别是关于文档的状态,但在这里......)
如果模块或类是直接在源代码à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
该 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
$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>;
}