Используйте модуль Perl, который является каталогом root внутри другого каталога - PullRequest
0 голосов
/ 18 апреля 2020

У нас есть Perl фреймворк, в котором мы создали какой-то настроенный модуль. Всякий раз, когда я пытаюсь использовать модули внутри подкаталога, выдается ошибка.

Ниже приведена структура моей папки, frameworkfolder - это базовый / root каталог проекта:

.../frameworkfolder/PerlModules/Initialize.pm

Мне нужно использовать это Initialize.pm в файле Perl, который находится в другом каталоге

.../frameworkfolder/TestCases/FVT/fvt/fvt.pl

В fvt.pl, когда я use PerlModules::Initialize, он выдает следующую ошибку:

Can't locate PerlModules/Initialize.pm in @INC (you may need to install the PerlModules::Initialize module) (@INC contains: /usr/opt/perl5/lib/site_perl/5.28.1/aix-thread-multi /usr/opt/perl5/lib/site_perl/5.28.1 /usr/opt/perl5/lib/5.28.1/aix-thread-multi /usr/opt/perl5/lib/5.28.1)

Как использовать пакет Initialize.pm Perl из fvt.pl? или любые другие perl файлы в любом другом каталоге?

Я пробовал следующие решения, но не повезло:

use lib '../../../frameworkfolder';

и

use FindBin; 
use lib "$FindBin::Bin"

и

use FindBin;
use File::Spec;
use lib File::Spec->catdir($FindBin::Bin, '../../', 'lib');

и

#!/usr/local/bin/perl -w -I /frameworkfolder/

Не нашли ответа в: Как создается Perl's @ IN C? (ака, какие есть способы повлиять на то, где ищут модули Perl?)

1 Ответ

1 голос
/ 19 апреля 2020

Если PerlModules/Initialize.pm содержит package Initialize;:

use FindBin qw( $RealBin );
use lib "$FindBin::RealBin/../../../PerlModules";
use Initialize;

Если PerlModules/Initialize.pm содержит package PerlModules::Initialize;:

use FindBin qw( $RealBin );
use lib "$FindBin::RealBin/../../..";
use PerlModules::Initialize;

(Первое имеет гораздо больше смысла.)

Примечания:

  • $Bin прерывается, если используется символическая ссылка на скрипт. $RealBin позволяет избежать этой проблемы.
  • Нет смысла использовать File :: Spe c. Ваш модуль не будет использоваться в VMS или Classi c Ma c OS.
  • Я понятия не имею, почему вы думаете об используемых вами путях (../../../frameworkfolder, ../../lib и /frameworkfolder/) будет работать. Ни один из них не находится на расстоянии. Попросите кого-нибудь научить вас основам относительных путей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...