Pracuję nad aplikacją, która jest napisanaPerl. Aplikacja jest teraz tak duża, że chcę przenieść każdą klasę do osobnego pliku. To skomplikowane budowanie i instalowanie programu; kiedy był tylko plik, można go łatwo skopiować w dowolne miejsce. Teraz muszę użyć takiego systemu Build::Module
lub ExtUtils::MakeMaker
.
Zdefiniowałem moje drzewo źródłowe tak, że mam dwa katalogi: bin
gdzie jest program uruchamiający program i lib
gdzie jest wiele modułów. Bin
zawiera wykonywalny skrypt Perla, który użytkownik wywołuje i ładuje niezbędny moduł z katalogu lib.
Mam problem z tym, że chcę, aby użytkownik mógł określić prefiks, w którym chce zainstalować program, podobnie jak --prefix
opcja oferowana przez pakiety oparte na GNU Autotools. Ponieważ może to nie być standardowa ścieżka, w której Perl szuka modułów (na przykład / opt / program), użytkownik zobaczy komunikat mówiący coś w rodzaju Can"t locate Program.pm in @INC
.
Czy istnieje sposób, aby program wykrył, gdzie moduły powinny zostać załadowane frm i dynamicznie dodaj tę ścieżkę do @INC
? Nie chcę, aby użytkownik musiał ręcznie pracować ze zmiennymi środowiskowymi, takimi jak PERL5LIB
aby uruchomić program.
Odpowiedzi:
3 dla odpowiedzi № 1Nie mógłbyś użyć znajdź i lib ?:
use FindBin qw($Bin);
use lib "$Bin/lib";
2 dla odpowiedzi nr 2
Jeśli cię rozumiem, rozpadasz sięduży program na mniejsze elementy. Dobrze dla ciebie! To świetna technika programowania. Dzięki temu każda klasa jest prawdziwym modułem Perla, co czyni go łatwiejszym w obsłudze.
Robię to cały czas. Najpierw używam nazwy modułu Local::
jako mój prefiks. CPAN nigdy nie użyje Local
jako prefiks modułu, więc wiem, że nigdy nie zderzę się z jakimś modułem CPAN. Potem umieściłem moje Local
katalog modułów w tym samym katalogu co mój skrypt. W większości standardowych instalacji Perla, gdy Perl szuka @INC
dla modułów ostatni katalog, którego szuka, jest katalogiem bieżącym (.
). Ponieważ moje nazwy modułów nigdy nie będą kolidować z żadnymi modułami CPAN, wiem, że Perl znajdzie tam moje moduły i tylko moje moduły ./Local
informator.
Możesz teraz dystrybuować cały katalogstruktura innym użytkownikom. Użytkownik musi jedynie zainstalować cały katalog (zawierający skrypty i moduły) i uruchomić skrypt. Nie ma potrzeby przechodzenia przez cały proces instalacji.
0 dla odpowiedzi № 3
Poniższy kod działa dla mnie. Podajesz opcję wiersza poleceń taką jak (--prefix abc) i ta wartość jest dołączana do ścieżki lib bardzo wcześnie w skrypcie. Zatem wszystkie następujące moduły będą przeszukiwane z dynamicznie ustawioną ścieżką.
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