Module 如何通过编程判断是否安装了Perl 6模块?
我在玩一个插件,可以加载可用的东西。Module 如何通过编程判断是否安装了Perl 6模块?,module,raku,Module,Raku,我在玩一个插件,可以加载可用的东西。$*REPO上的文档不太清楚,所以我猜了一下。这似乎有效,但我觉得我错过了一些更简单的东西(除了其他方面的常规高尔夫): my@modules=; my@installed=收集已安装的模块(@modules); 放置“已安装:@installed[]”; try require::(@installed[0]); #有没有更好的方法不用评估就能做到这一点 my$digest=:(@installed[0])。新建; 子安装模块(*@候选){ 对于@candi
$*REPO
上的文档不太清楚,所以我猜了一下。这似乎有效,但我觉得我错过了一些更简单的东西(除了其他方面的常规高尔夫):
my@modules=;
my@installed=收集已安装的模块(@modules);
放置“已安装:@installed[]”;
try require::(@installed[0]);
#有没有更好的方法不用评估就能做到这一点
my$digest=:(@installed[0])。新建;
子安装模块(*@候选){
对于@candidates->$module{
放入$module,'-'x 15;
my$ds=CompUnit::DependencySpecification.new:
:简称($module);
如果$*REPO.resolve:$ds{
放入“找到$module”;
以$module为例;
}
否则{
放入“未找到$module”;
}
}
}
$*REPO.resolve(CompUnit::DependencySpecification.new(:short name))
请注意,这只在一定程度上有用,因为这只会告诉您模块是否可以解析。我的意思是,它还会检测到由目录(如-I lib
)提供的未安装模块,您将不知道它来自哪个CompUnit::Repository。您还可以grep类似于$*REPO.REPO chain.grep(*~~CompUnit::Repository::Installable).map(*.installed.flat的结果
另外,“安装”模块的含义不是那么简单--<代码> COMPUn::存储库:可安装的库是可能隐含的,但是考虑一个第三方编译器::存储库(如)——基本上仍然安装了这些模块,但是repo本身不是可安装的。All::Installable在rakudo中的真正含义是rakudo知道如何安装它——它与rakudo知道如何查找和加载无关
一些PRs(已关闭,但我最终将重新访问)通过方法{…}
帮助解决其中一些问题:
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>))