我找不到正确访问已安装发行版资源的方法.例如,动态加载模块时:
require ::($module);
获取它的一种方法%?RESOURCES是让模块有一个可以返回此哈希的sub:
sub resources { %?RESOURCES }
但这增加了样板代码.
另一种方法是深度扫描$*REPO和获取模块的分布元.
有没有更好的选择来完成这项任务?
一种方法是使用$*REPO(正如您已经提到的)以及作为META6数据的接口及其到给定数据存储/文件系统的映射的Distribution对象CompUnit::Repository.
my $spec = CompUnit::DependencySpecification.new(:short-name<Zef>);
my $dist = $*REPO.resolve($spec).distribution;
say $dist.content("resources/$_").open.slurp for $dist.meta<resources>.list;
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于目前已安装的发行版,但适用于尚未安装的发行版(如-Ilib)https://github.com/rakudo/rakudo/pull/1812