如何以编程方式告诉我是否安装了Perl 6模块?

时间:2018-02-21 06:06:44

标签: module perl6

我正在玩一个可以加载可用内容的插件。 $*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";
            }
        }
    }

1 个答案:

答案 0 :(得分:9)

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

请注意,这仅在某种程度上有用,因为这只会告诉您是否可以解析模块。我的意思是,它还会检测由-I lib等目录提供的未安装模块,您不会知道它来自哪个 CompUnit ::存储库从。您还可以查看$*REPO.repo-chain.grep(* ~~ CompUnit::Repository::Installable).map(*.installed).flat

之类的结果

另外&#34;安装&#34;的含义模块不是那么简单 - CompUnit::Repository::Installable存储库是可能隐含的,但考虑第三方CompUnit ::存储库(例如https://github.com/ugexe/Perl6-CompUnit--Repository--Tar) - 这个模块基本上仍然安装,但是repo本身不是CompUnit::Repository::Installable。 All :: Installable在rakudo中真的意味着 rakudo知道如何安装它 - 它与 rakudo知道如何查找和加载

无关

有些PR(已关闭,但最终会重新访问)有助于通过method candidates { ... }解决其中一些问题:

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

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