我在玩一个插件thing,可以加载可用的东西。 $*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";
            }
        }
    }

最佳答案

$*REPO.resolve(CompUnit::DependencySpecification.new(:short-name<Test>))

请注意,这仅在某种程度上有用,因为它仅告诉您是否可以解析模块。我的意思是,它还会检测到诸如-I lib之类的目录提供的未安装模块,并且您将不知道它来自哪个CompUnit::Repository。您也可以grep像$*REPO.repo-chain.grep(* ~~ CompUnit::Repository::Installable).map(*.installed).flat这样的结果

另外,“已安装”模块的含义不是那么简单-可能隐含了CompUnit::Repository::Installable存储库,但请考虑第三方CompUnit::Repository(例如https://github.com/ugexe/Perl6-CompUnit--Repository--Tar)-该模块实际上仍已安装,但是该存储库本身不是CompUnit::Repository::Installable。所有:: Installable真正在rakudo中意味着rakudo知道如何安装-与rakudo知道如何查找和加载无关

一些PR(已关闭,但我最终会重新讨论),它们可以通过method candidates { ... }帮助解决其中的一些问题:

https://github.com/rakudo/rakudo/pull/1125

https://github.com/rakudo/rakudo/pull/1132

10-07 14:59