我正在玩一个可以加载可用内容的插件.关于它的文档$*REPO并不完全存在,所以我猜了一下.这似乎有效,但我感觉我错过了一些更简单的东西(除了常规打高尔夫球的其他位):
my @modules = <Digest::MD5 NotThere PrettyDump>;
my @installed = gather installed-modules( @modules );
put "Already installed: @installed[]";
try require ::( @installed[0] );
# is there a better way to do this without eval
my $digest = ::( @installed[0] ).new;
sub installed-modules ( *@candidates ) {
for @candidates -> $module {
put $module, '-' x 15;
my $ds = CompUnit::DependencySpecification.new:
:short-name($module);
if $*REPO.resolve: $ds {
put "Found $module";
take $module;
}
else {
put "Didn't find $module";
}
}
}
Run Code Online (Sandbox Code Playgroud)
$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name<Test>))
Run Code Online (Sandbox Code Playgroud)
请注意,这仅在某种程度上有用,因为这只会告诉您是否可以解析模块.我的意思是它还会检测一个目录提供的未安装的模块-I lib,你不会知道它来自哪个 CompUnit :: Repository.你也可以grep结果$*REPO.repo-chain.grep(* ~~ CompUnit::Repository::Installable).map(*.installed).flat
此外,"已安装"模块的含义并非如此简单 - CompUnit::Repository::Installable存储库可能是隐含的,但考虑第三方CompUnit ::存储库(例如https://github.com/ugexe/Perl6-CompUnit--存储库)--Tar) - 这个模块基本上仍然安装,但repo本身不是CompUnit::Repository::Installable.所有:: Installable真的意味着rakudo是rakudo知道如何安装它 - 它与rakudo知道如何查找和加载无关
一些PR(关闭,但我将最终重访)有助于通过以下方式解决其中一些问题method candidates { ... }:
https://github.com/rakudo/rakudo/pull/1125
https://github.com/rakudo/rakudo/pull/1132