Подтвердить что ты не робот

Как включить модуль Perl в другой каталог?

Как включить модуль Perl в другой каталог? Это должен быть относительный путь от модуля, который включает его.

Я пробовал

push ( @INC,"directory_path/more_path");

и

push ( @INC,"directory_path\\more_path");
4b9b3361

Ответ 1

EDIT: сначала выберите правильное решение, первоначально из этого вопроса. Это единственный, который ищет по сравнению с модулем:

use FindBin;                 # locate this script
use lib "$FindBin::Bin/..";  # use the parent directory
use yourlib;

Существует много других способов поиска библиотек относительно каталога current. Вы можете вызывать perl с аргументом -I, передавая директорию другого модуля:

perl -I.. yourscript.pl

Вы можете включить строку в верхней части вашего perl script:

use lib '..';

Вы можете изменить переменную среды PERL5LIB перед запуском script:

export PERL5LIB=$PERL5LIB:..

Стратегия push (@INC) также может работать, но ее необходимо обернуть в BEGIN {}, чтобы убедиться, что нажатие запускается до поиска модуля:

BEGIN {push @INC, '..'}
use yourlib;

Ответ 2

Скорее всего, причина, по которой ваш push не работал, - это порядок выполнения.

use - это директива времени компиляции. Вы push выполняются во время выполнения:

push ( @INC,"directory_path/more_path");
use Foo.pm;  # In directory path/more_path

Вы можете использовать блок BEGIN, чтобы обойти эту проблему:

BEGIN {
    push ( @INC,"directory_path/more_path");
}
use Foo.pm;  # In directory path/more_path

IMO, это яснее, и поэтому лучше всего use lib:

use lib "directory_path/more_path";
use Foo.pm;  # In directory path/more_path

См. perlmod для получения информации о BEGIN и других специальных блоках и при их выполнении.

Edit

Для загрузки кода относительно вашей библиотеки script/я настоятельно рекомендую File::FindLib

Вы можете сказать use File::FindLib 'my/test/libs'; искать каталог библиотеки где-нибудь выше вашего script в пути.

Скажите, что ваша работа структурирована следующим образом:

   /home/me/projects/
    |- shared/
    |   |- bin/
    |   `- lib/
    `- ossum-thing/
       `- scripts 
           |- bin/
           `- lib/

Внутри script в ossum-thing/scripts/bin:

use File::FindLib 'lib/';
use File::FindLib 'shared/lib/';

Найдете каталоги библиотеки и добавьте их в @INC.

Также полезно создать модуль, содержащий всю настройку среды, необходимую для запуска вашего набора инструментов, и просто загрузить его во все исполняемые файлы в вашем проекте.

use File::FindLib 'lib/MyEnvironment.pm'

Ответ 3

'use lib' также может принимать одно строковое значение...

#!/usr/bin/perl
use lib '<relative-path>';
use <your lib>;

Ответ 4

Из perlfaq8:


Как добавить каталог, в котором находится моя программа, в путь поиска модуля/библиотеки?

(внесенный brian d foy)

Если вы уже знаете каталог, вы можете добавить его в @INC, как и для любого другого каталога. Вы можете использовать lib, если знаете каталог во время компиляции:

use lib $directory;

Трюк в этой задаче - найти каталог. Прежде чем ваш script сделает что-нибудь еще (например, chdir), вы можете получить текущий рабочий каталог с модулем Cwd, который поставляется с Perl:

BEGIN {
    use Cwd;
    our $directory = cwd;
    }

use lib $directory;

Вы можете сделать аналогичную вещь со значением $0, который содержит имя script. Это может относить относительный путь, но rel2abs может превратить его в абсолютный путь. Если у вас есть

BEGIN {
    use File::Spec::Functions qw(rel2abs);
    use File::Basename qw(dirname);

    my $path   = rel2abs( $0 );
    our $directory = dirname( $path );
    }

use lib $directory;

Модуль FindBin, который поставляется с Perl, может работать. Он находит каталог текущего запущенного script и помещает его в $Bin, который затем можно использовать для построения правильного пути библиотеки:

use FindBin qw($Bin);

Ответ 5

Я удивлен, что никто не упомянул об этом раньше, но FindBin:: libs всегда будет находить ваши библиотеки, поскольку он ищет во всех разумных местах. к местоположению вашего script.

#!/usr/bin/perl
use FindBin::libs;
use <your lib>;

Ответ 6

Я расскажу вам, как это можно сделать в eclipse. Моя система dev - Windows 64bit, Eclipse Luna, плагин Perlipse для eclipse, Strawberry pearl installer. Я использую perl.exe как мой интерпретатор.

Eclipse > создайте новый проект perl > щелкните правой кнопкой мыши проект > путь сборки > настроить путь сборки > вкладка библиотек > добавить внешнюю исходную папку > перейдите в папку, где установлены все ваши модули perl > ok > ok. Сделано!