Distribution::Resource
是每个单独的资源(文件或库),它们作为 %?RESOURCES
动态变量的值返回(该变量本身是 Distribution::Resources
的实例)。这些资源作为标准发行版安装过程的一部分安装;有关更多上下文,请查看上面 %?RESOURCES
的定义。
从外部来看,每个资源的行为都像一个 IO::Path
,并且它共享许多相同的方法;但是,它实际上不是一个 IO::Path
,因此不能与它进行智能匹配。
此变量将与当前的存储库链结构一起使用,并将为您提供独立于其是否已安装的访问资源的正确方法;但是,您不应该依赖这些值在不同实现之间保持一致性。无论如何,您都将能够通过其句柄访问资源。在此示例中
unit ;method gimme(::?CLASS: )
使用此 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> ->
直接从源目录运行,如下所示
# 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/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(<libraries/whatever>)
返回的 Distribution::Resource
将具有发行版运行的特定体系结构的正确名称和扩展名。
一般而言,在任何情况下,指导原则是资源应直接用于其预期目的,无论是共享库还是常规资源文件。
方法§
方法 IO§
method IO()
将相应的资源作为 IO::Path
返回,可以有效地用作此类资源。