2017-07-03 35 views
9

Bar.pm,我宣布一类的机构(作家)和版本:如何找到Perl 6模块的版本和权限?

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

如果我在程序中使用它,我怎么看它的模块,我的版本使用,谁写的,以及模块加载器如何发现它?与往常一样,链接到文档非常重要。

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

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

+1

[“auth”是“auth”而不是“author”](https://irclog.perlgeek.de/perl6/2017-04-20#i_14460369)。 – raiph

+1

“[auth]信息...显示在META.json文件中,但不包含代码。” [TimToady,关于这个问题](https://irclog.perlgeek.de/perl6/2017-04-20#i_14460332):“当一个模块被修补时强制一个新版本......我发送了一个pr到jnthn来修复一个错误,但忘了增加patchlevel,所以zef没有看到它...... name/ver/auth [must]对应于一个唯一的文本,如果安装到官方库[OR]包含[crypto]散列作为的身份[OR] git修订版...如果你不能命名你正在寻找的“正确”版本,这将是一场噩梦“。 – raiph

回答

9

(可能不是一个令人满意的答案,因为这件事的事实并不令人非常满意,尤其是关于文件的状态,但在这里它去...)


如果模块或类是在源代码中直接版本点菜class Bar:auth<Camelia>:ver<4.8.12>,则该输入任何代码可以introspect它:

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 

Ť


不幸的是,我不认为元对象目前提供一种方式来获得在模块/类的源路径。
通过手动经历的步骤是userequire的加载时编译单元,你至少可以在(即从$PERL6LIBuse 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-unitCompUnit类型的对象。
$comp-repoCompUnit::Repository::FileSystem
这两个文档页面都不存在,$*REPO仅在list of dynamic variables中简要提及。


如果模块是一个正确建立distribution的一部分,你可以在它的META6.jsonas posted by Lloyd Fournier在你所说的邮件列表线程)定义的元信息:

if try $comp-unit.distribution.meta -> %dist-meta { 
    say %dist-meta<ver>; 
    say %dist-meta<auth>; 
    say %dist-meta<license>; 
} 
+1

我想更详细地探索CompUnit的东西,但我认为这个答案是一样好。我想出了基本相同的东西。谢谢! –