如何获取模块的不同文件的文件路径?

问题描述 投票:7回答:2

如何获取模块的另一个文件的路径?

我试过这种方式,但我不知道从哪里得到$here,我不知道如果我有$here它是否会起作用?

use v6;
unit class Aaa::Bbb::Ccc;

my $here = '.../lib/Aaa/Bbb/Ccc.pm6'.IO;
my $bin = $here.parent.parent.parent.add( 'bin' ).add( 'app' );

use Pod::Load;
my $pod = load( $bin );
# use the $pod

当我尝试这个时,$pod是空的:

use Pod::Load;
my $pod = load( $*PROGRAM );
say $pod.perl;  # $[]
module path package perl6
2个回答
8
投票

没有“模块的另一个文件”这样的东西。模块只代表一个文件;分布代表多个模块,因此代表多个文件。另外,模块不能假设它是从文件系统加载的 - 它可能从tar filesocket加载到内存中,并且如果模块试图访问例如"../MyOtherModule.pm6".IO显然会失败。

您可以安全地做到的是获取同一发行版中任何模块的内容:

unit class Aaa::Bbb::Ccc;

my $bin-code = $?DISTRIBUTION.content("bin/app").open.slurp;

1
投票

更新:正如@ugexe指出的那样,如果您打算安装模块,这将无法正常工作。


$?DISTRIBUTION似乎是一个很好的解决方案。

否则另一种方法是使用$?FILE变量。如果要在程序中的其他位置使用它,则需要从模块中导出:

unit module MyModule;

our sub myDIR() {
    $?FILE.IO.dirname;
}
use MyModule;
myDIR()~"/relative/path/to/somefile
© www.soinside.com 2019 - 2024. All rights reserved.