【问题标题】:How can I tell programmatically if a Perl 6 module is installed?如何以编程方式判断是否安装了 Perl 6 模块?
【发布时间】:2018-02-21 06:06:44
【问题描述】:

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

【问题讨论】:

    标签: module raku


    【解决方案1】:
    $*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

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2010-09-16
      • 2014-12-12
      • 2012-03-09
      • 2010-10-22
      相关资源
      最近更新 更多