如何计算模块的 dist hash
How to calculate a module's dist hash
我使用 LoneStar 在 ~/.rakudo-star/rakudo-star-2018.04
中安装了 Perl 6。 zef
安装模块时,它会安装到 Rakudo Perl 6 目录的子目录中。这里有一个名为 perl6/site/resources
的目录,它似乎包含所有已安装的文件。我如何使用 Perl 6 找出哪个模块包含在哪个文件中?
如果我没记错的话,你不应该。 zef 必须照顾它。但是,如果确实需要,请使用 zef locate
目录中的 SHA1 签名
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
这将 return
===> 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
如果您想获取将要加载的命名空间的源代码,您可以执行以下操作:
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
仅在 resolve 从 CompUnit::Repository::Installation
存储库返回 CompUnit 时才有效。
rakudo@1812 是进一步改进这一点的框架,允许查询单个存储库($*REPO.resolve
迭代存储库的链接列表以给出结果)并统一 resolve/candidates/etc 的行为在 CompUnit::Repository::Installation
和 CompUnit::Repository::FileSystem
之间。
我使用 LoneStar 在 ~/.rakudo-star/rakudo-star-2018.04
中安装了 Perl 6。 zef
安装模块时,它会安装到 Rakudo Perl 6 目录的子目录中。这里有一个名为 perl6/site/resources
的目录,它似乎包含所有已安装的文件。我如何使用 Perl 6 找出哪个模块包含在哪个文件中?
如果我没记错的话,你不应该。 zef 必须照顾它。但是,如果确实需要,请使用 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
这将 return
===> 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
如果您想获取将要加载的命名空间的源代码,您可以执行以下操作:
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
仅在 resolve 从 CompUnit::Repository::Installation
存储库返回 CompUnit 时才有效。
rakudo@1812 是进一步改进这一点的框架,允许查询单个存储库($*REPO.resolve
迭代存储库的链接列表以给出结果)并统一 resolve/candidates/etc 的行为在 CompUnit::Repository::Installation
和 CompUnit::Repository::FileSystem
之间。