Как получить путь в файле другого файла модуля? - PullRequest
7 голосов
/ 26 апреля 2019

Как мне получить путь к другому файлу модуля?

Я пробовал это так, но я не знаю, где взять $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;  # $[]

Ответы [ 2 ]

8 голосов
/ 26 апреля 2019

Не существует такого понятия, как «другой файл модуля». Модуль будет представлять только один файл; дистрибутив представляет несколько модулей и, следовательно, несколько файлов. Кроме того, модуль не может предположить, что он загружается из файловой системы - он может быть загружен в память из tar-файла или сокета , и если модуль попытается получить доступ например "../MyOtherModule.pm6".IO это, очевидно, потерпит неудачу.

То, что вы можете безопасно сделать, это получить содержимое любого модуля в том же дистрибутиве:

unit class Aaa::Bbb::Ccc;

my $bin-code = $?DISTRIBUTION.content("bin/app").open.slurp;
1 голос
/ 29 апреля 2019

Обновление: Как указал @ugexe, если вы собираетесь установить модуль, это не сработает.


$? Распределение похоже на хорошее решение.

В противном случае альтернативой является использование переменной $? FILE.Вам нужно будет экспортировать это из вашего модуля, если вы хотите использовать его в другом месте вашей программы:

unit module MyModule;

our sub myDIR() {
    $?FILE.IO.dirname;
}
use MyModule;
myDIR()~"/relative/path/to/somefile
...