我已经在~/.rakudo-star/rakudo-star-2018.04中使用LoneStar安装了Perl 6。当zef安装一个模块时,它会安装到Rakudo 6目录的一个子目录中。这里有一个名为perl6/site/resources的目录,它似乎保存了所有已安装的文件。如何使用Perl 6确定哪个模块包含在哪个文件中?
发布于 2018-06-24 07:21:48
如果我没记错的话,你就不应该记得了。这是齐夫那个必须处理它的人。但是,如果您必须这样做,请在目录中使用SHA1签名和zef locate
zef --sha1 locate 5417D0588AE3C30CF7F84DA87D27D4521713522A将输出(在我的系统中)
===> From Distribution: zef:ver<0.4.4>:auth<github:ugexe>:api<>
lib/Zef/Service/Shell/PowerShell/download.pm6 => /home/jmerelo/.rakudobrew/moar-2018.06/install/share/perl6/site/sources/5417D0588AE3C30CF7F84DA87D27D4521713522A从您的问题中可以看出,您想做的事情是否正好相反,也就是说,找出哪个SHA1对应于哪个文件;在这种情况下,尝试这样做:
zef locate bin/lwp-download.pl会回来的
===> From Distribution: LWP::Simple:ver<0.103>:auth<Cosimo Streppone>:api<>
bin/lwp-download.pl => /home/jmerelo/.rakudobrew/moar-2018.06/install/share/perl6/site/resources/059BD7DBF74D1598B0ACDB48574CC351A3AD16BC发布于 2018-06-24 23:28:42
如果您想获取要加载的命名空间的源,可以这样做:
my $module-name = 'Test';
# Get a Distribution object which provides an IO interface to its contents
my $compunit = $*REPO.resolve(CompUnit::DependencySpecification.new(:short-name{$module-name}));
my $distribution = $compunit.distribution;
my $handle-from-name = $distribution.content($distribution.meta<provides>{$module-name}.keys[0]).open;
say $handle-from-name.slurp(:close);
# Or if we already know the name-path:
my $handle-from-path = $distribution.content("lib/Test.pm6").open;
say $handle-from-path.slurp(:close);注意,只有在解析从一个$compunit.distribution存储库返回一个CompUnit时,CompUnit::Repository::Installation才能工作。
rakudo@1812是进一步改进这一功能的框架,允许查询单个存储库( $*REPO.resolve迭代链接的repos列表以给出结果),并在CompUnit::Repository::Installation和CompUnit::Repository::FileSystem之间统一解析/候选/etc的行为。
https://stackoverflow.com/questions/51005794
复制相似问题