/ / Jak dynamicznie dodać ścieżkę biblioteki programu do @INC w programie Perl? - perl

Jak dynamicznie dodać ścieżkę biblioteki programu do @INC w programie Perl? - perl

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 № 1

Nie 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