/ / Как да добавяте динамично пътя на библиотечната програма към @INC в Perl програмата? - perl

Как да добавяте динамично пътя на библиотеката на програмата към @INC в програмата Perl? - perl

Работя върху приложение, което е написано наPerl. Приложението е толкова голямо, че сега искам да преместя всеки клас в отделен файл. Това сложно изграждане и инсталиране на програмата; когато беше само файл, лесно можеше да бъде копиран навсякъде. Сега трябва да използвам подобна система Build::Module или ExtUtils::MakeMaker.

Структурирах дървото на източника си, така че да имам две директории: bin където е стартерът на програмата, и lib където има няколко модула. Bin съдържа изпълним Perl скрипт, който потребителят извиква, и зарежда необходимия модул от директорията lib.

Проблемът, който имам е, че искам потребителят да може да посочи префикс, където искат инсталираната програма, подобно на --prefix опция, предлагана от пакети, базирани на GNU Autotools. Тъй като това не е стандартен път, където Perl търси модули (например / opt / program), потребителят ще види съобщение, казващо Can"t locate Program.pm in @INC.

Има ли начин да накарате програмата да открие къде трябва да бъдат заредени модулите и да добавяте динамично този път @INC? Не искам потребителят да работи ръчно с подобни променливи на средата PERL5LIB за да стартирате програмата.

Отговори:

3 за отговор № 1

Не можеше да се използва findbin и ИЪ ?:

use FindBin qw($Bin);
use lib "$Bin/lib";

2 за отговор № 2

Ако те разбирам, ти прекъсваш голямаголяма програма на по-малки компоненти. Добре за теб! Това е страхотна техника за програмиране. Превръщането на всеки клас в истински Perl модул е ​​чудесна идея.

Правя това през цялото време. Първо използвам името на модула Local:: като моя префикс. CPAN никога няма да използва Local като модулен префикс, така че знам, че никога няма да се сблъскам с някой CPAN модул. После сложих Local директория на модула в същата директория като моя скрипт. В повечето стандартни Perl инсталации, когато Perl търси @INC за модули, последната директория, която търси, е текущата директория (.). Тъй като моите имена на модули никога няма да се сблъскат с никакви CPAN модули, знам, че Perl ще открие модулите си и само моите модули ./Local директория.

Вече можете да разпространявате цялата директорияна други потребители. Всичко, което потребителят трябва да направи, е да инсталира цялата си директория (която включва скриптовете и модулите) и да изпълни скрипта. Няма нужда да преминете през целия процес на инсталиране.


0 за отговор № 3

Следният код работи за мен. Предоставяте опция за команден ред като (--prefix abc) и тази стойност се добавя към пътя на библиотеката много рано във вашия скрипт. Така всички следващи модули ще се търсят с динамично зададената пътека.

use strict;
use warnings;
use Getopt::Long;

my $prefix = "";

BEGIN {
GetOptions ("prefix=s" => $prefix );
$prefix = $prefix || ".";
}

use lib "$prefix";
use mymod; # uses the dynamical search path