问题 如何找到Perl 6模块的版本和权限?


Bar.pm,我声明一个具有权限(作者)和版本的类:

class Bar:auth<Camelia>:ver<4.8.12> {
    }

如果我在程序中使用它,我如何查看我正在使用的模块版本,编写者以及模块加载器如何找到它?与往常一样,文档链接很重要。

这个问题也被问到了 perl6用户 但在出现令人满意的答案(或文档链接)之前死亡。

这个问题的另一个问题是许多人没有将这些信息添加到他们的类或模块定义中。它显示在 META.json 文件,但不是代码。


12058
2017-07-03 10:59


起源

“auth”是“auth”而不是“author”。 - raiph
“[auth]信息......显示在META.json文件中,但不显示在代码中。” TimToady,关于这个问题:“在修补模块时强制使用新版本......我发送了一个pr到jnthn来修复bug,但是忘了增加补丁级别,所以zef看不到它... name / ver / auth [必须]对应于一个独特的文本,如果安装到官方库[OR]包括[加密]哈希作为身份[OR] git修订版的一部分...如果你不能命名“正确”版本你将是一场噩梦“寻找独特的”。 - raiph


答案:


(可能不是一个令人满意的答案,因为事情的事实不是很令人满意,特别是关于文档的状态,但在这里......)


如果模块或类是直接在源代码à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 方法由:


不幸的是,我不认为元对象目前提供了一种获取模块/类的源路径的方法。
通过手动完成这些步骤 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>;
}

11
2017-07-03 17:20



我想更详细地探讨CompUnit的内容,但我认为这个答案和它一样好。我想出了基本相同的东西。谢谢! - brian d foy
你能说明文件的问题吗?我想帮助那里...... - jjmerelo
@jjmerelo:我想我指的是两个不完整的 Metamodel:: 我链接到顶部的doc页面,以及整个文档在文档中不容易获得的事实(理想情况是在一个地方),而是必须从文档,规范,Rakudo源代码中收集,和实验。 - smls