Работя върху приложение, което е написано на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