class Distribution::Resource { }

Distribution::Resource 是每个单独的资源(文件或库),它们作为 %?RESOURCES 动态变量的值返回(该变量本身是 Distribution::Resources 的实例)。这些资源作为标准发行版安装过程的一部分安装;有关更多上下文,请查看上面 %?RESOURCES 的定义。

从外部来看,每个资源的行为都像一个 IO::Path,并且它共享许多相同的方法;但是,它实际上不是一个 IO::Path,因此不能与它进行智能匹配。

此变量将与当前的存储库链结构一起使用,并将为您提供独立于其是否已安装的访问资源的正确方法;但是,您不应该依赖这些值在不同实现之间保持一致性。无论如何,您都将能够通过其句柄访问资源。在此示例中

unit class Resourceable;
 
method gimme(::?CLASS:U: ) {
    %?RESOURCES;
}

使用此 META6.json

{
  "provides": {
    "Resourceable": "lib/Resourceable.rakumod"
  },
  "license": "github:JJ",
  "description": "Testing how Distribution::Resource(s) work",
  "perl": "6.*",
  "auth": "Write me!",
  "version": "0.0.1",
  "resources": [
    "libraries/whatever",
    "data/swim.csv"
  ],
  "meta-version": "0",
  "name": "Resourceable"
}

您会看到,有两种可用的资源:常规资源和以 libraries 开头的资源,其实际返回的值(和句柄)将取决于其运行的操作系统。如果我们通过此脚本(放置在 bin/ 中)访问它

use Resourceable;
 
for <libraries/whatever data/swim.csv> -> $resource {
    with Resourceable.gimme{$resource} {
       .say;
       say "-" x 10">";
       ( .repo-name.repo.dist-id.key )».say;
    }
}

直接从源目录运行,如下所示

# raku -Ilib bin/show-resources.raku
"/home/jmerelo/progs/raku/my-raku-examples/test-resources/resources/libraries/libwhatever.so".IO
---------->
(Str)
file#/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib
/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib:ver<*>:auth<>:api<*>
libraries/whatever
"/home/jmerelo/progs/raku/my-raku-examples/test-resources/resources/data/swim.csv".IO
---------->
(Str)
file#/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib
/home/jmerelo/progs/raku/my-raku-examples/test-resources/lib:ver<*>:auth<>:api<*>
data/swim.csv

但是,如果我们安装发行版并运行已安装的脚本,我们将得到类似的内容

"/home/jmerelo/.rakubrew/versions/moar-2020.05/install/share/perl6/site/resources/7127AA0E7F43E87DF309570E813E46A6E2C4D0B2.so".IO
---------->
site
(Str)
1F8F9C004D7E952B297F30420DA07B354B3F2AA7
libraries/whatever
"/home/jmerelo/.rakubrew/versions/moar-2020.05/install/share/perl6/site/resources/D357F3E46256CB0DACD8975033D1CC7A17B4CF9F.csv".IO
---------->
site
(Str)
1F8F9C004D7E952B297F30420DA07B354B3F2AA7
data/swim.csv

主要区别在于,如您所见,“本地”发行版为 repo 定义了值,而“已安装”发行版为 repo-name 定义了值。dist-id 将根据发行版的类型而有所不同,在任何情况下,.key 都将返回资源伪哈希键的名称。

另请注意,通过其键访问资源将返回对资源的句柄,该句柄指向 IO::Path,但实际上是一个 Distribution::Resource 对象。再次查看“常规”资源,它转换到的路径将与 META6.json 中声明的路径相同,但对于“库”资源,它将更改为转换为与值相对应的规范库名称,在第一种情况下为 libwhatever.so,在第二种情况下为具有规范 Linux 扩展名的哈希名称,.so

Distribution::Resource 旨在直接用作它所代表的资源,例如文件

my @data = %?RESOURCES<data/swim.csv>.lines.split(",");

但是,这不是因为它返回 IO::Path,而是因为它与它共享许多方法:Str, gist, raku, absolute, is-absolute, relative, is-relative, parts, volume, dirname, basename, extension, open, resolve, slurp, lines, comb, split, words, copy;例如,我们在上面使用 .lines

对于放置在 libraries/ 文件夹中的资源,其主要用例是作为 is native 的参数,例如以下示例

use NativeCall;
sub foo() is native(%?RESOURCES<libraries/whatever>)

返回的 Distribution::Resource 将具有发行版运行的特定体系结构的正确名称和扩展名。

一般而言,在任何情况下,指导原则是资源应直接用于其预期目的,无论是共享库还是常规资源文件。

方法§

方法 IO§

method IO()

将相应的资源作为 IO::Path 返回,可以有效地用作此类资源。