Как я могу добавить относительные пути к библиотекам в Perl? - PullRequest
0 голосов
/ 25 июня 2019

Я хочу иметь библиотеку (my_library_1), которая использует другую библиотеку в папке относительно себя.Если я напишу это так:

use lib "/./libraries/";
use my_library_2;

Он будет использовать путь, из которого я выполняю сценарий.

Если я буду использовать следующее, как предложено в других подобных запросах:

use FindBin;
use lib "$FindBin::Bin/./libraries/";
use my_library_2;

Это будет относительно выполняемого основного сценария, поэтому, если я вызываю эту библиотеку из другого сценария, а затем эта библиотека вызывает другой (my_library_1), объявление библиотеки будет не таким, как ожидалось, еслиПервая библиотека (my_library_1) и основной сценарий находятся в одной папке.

Как решить эту проблему, не полагаясь на абсолютные пути?

Редактировать: добавить дополнительную информацию Это текущаяструктура:

folder
\_folder_1
 \__main_script
\_folder_2
 \__my_library_1
 \__folder_1
   \___my_library_2

Я хочу сослаться на library_3 из library_2 с относительным путем.Два предложенных варианта не работают, когда я использую их на «my_library_2».

Ответы [ 2 ]

1 голос
/ 25 июня 2019

lib ::lative - это простой способ использовать __FILE__ для добавления абсолютизированных путей lib относительно скрипта или модуля. Он также документирует эквивалентные команды основного модуля, поэтому его не нужно устанавливать.

В сценарии:

use lib::relative '../folder2';

или

use Cwd ();
use File::Basename ();
use File::Spec ();
use lib File::Spec->catdir(File::Basename::dirname(Cwd::abs_path __FILE__), '../folder2');

Аналогично в модуле:

use lib::relative 'folder1';

Я рекомендую гораздо более простой __FILE__ подход к FindBin во всех случаях - FindBin - это действие на расстоянии, требующее обходных путей и с серьезными ошибками на старых Perls, которые нельзя исправить, поскольку он недоступен на CPAN .

0 голосов
/ 25 июня 2019

Вот один подход с использованием __FILE__ для получения имени каталога my_library_1.pm:

folder1 / main.pl :

use strict;
use warnings;
use FindBin;

use lib "$FindBin::RealBin/../folder2/";
use my_library_1;

folder2 / my_library_1.pm :

package my_library_1;
use strict;
use warnings;
use File::Basename qw(dirname);

my $dir;
BEGIN {
    $dir = dirname(__FILE__);
}
use lib "$dir/folder1";
use my_library_2;
...