Portál AbcLinuxu, 21. května 2025 22:33
./script.pl
), není problém... použije se normálně use Modul
nebo Gtk2::GladeXML->new('gui.glade')
.
Problém nastane, když chci svůj program nějak „nainstalovat“ do systému abych ho mohl spouštět odkudkoliv nebo dokonce dopravit do jiného počítače. Soubory by se hledaly v adresáři, odkud to spouštím. Takže je potřeba nějak nastavit místo, kde je program nainstalován. Nejlépe tak aby se to nemuselo ručně přepisovat když se to nakopíruje jinam ;)
Mám dvě řešení a ani jedno se mi nelíbí. Jak to udělat líp?
1)
přidat do @INC správnou cestu například spuštěním přes perl -I /kde/to/je /kde/to/je/script.pl
.
modul se načte správně a přístup k souborům by byl nějak takto: …->new($INC[0].'/gui.glade')
.
Nevýhoda: musí se to obalit dalším scriptem, který spustí perl se správným parametrem -I
a bude tam muset ta cesta být napevno
2)
zjistit cestu z $0
třeba takto: $dir = $0 =~ /(.*)\//;
a pak jí v BEGIN přidat do @INC a soubory hledat v $dir
Nevýhoda: Pokud si celý program uložím třeba do /home/neco/neco/... a někde v $PATH na něj udělám symlinky, $0
bude obsahovat cestu k symlinkům a ne tam, kde soubor je opravdu a tam to samozřejmě ty ostatní soubory nenajde.
--
A jako takový poddotaz bych se zeptal kam vlastně takovýto script/program „instalovat“? nechat všechny soubory v jedné složce a tu dát kamkoliv (/home nebo /opt) a v /usr/local/bin udělat symlinky, nebo do /usr/local/bin dát místo symlinku rovnou ten hlavní spustitelný script a ostatní soubory jinam (/usr/local/share/jmenoprogramu/ ?) Pak by zase script nemohl hledat své soubory ve stejné složce jako je sám...
Zároveň bych chtěl aby to stejně fungovalo i v „nenainstalovaném“ stavu při testování – všechno v jednom adresáři v /home/…/…
--
Předem děkuji za jakékoliv tipy jak se tohle řeší
Pro vytvoreni modulu (skript.pl muze byt soucasti modulu) byste mel pouzit standardni mechanizmy (Makefile.PL + instalaci). Viz dokumentace, man perlnewmod, odkazy na dalsi dokumentaci a tutorial tam atd. Vyhoda teto masinerie je, ze mate jeden archiv Vas-Modul-1.0.tar.gz
, jehoz standardni instalaci muzete najednou nainstalovat, spustit testy, doresit zavislosti, provest transformaci nejakych retezcu (napr. ony cesty) a dalsi. Timto mechanizmem pro instalaci modulu se Vas::Modul nainstaluje nekam jako /usr/lib/perl5/site_perl/5.10.0/Vas/Modul.pm
, pripadne skripty do /usr/bin
, kde vse funguje jakychkoliv zasahu. Odinstalace je otazka smazani tohoto souboru nebo adresare Vas
.
Pokud chcete nejakou nestandardni cestu (coz lze u "normalniho mechanizmu" docilit take pres --prefix
), spravne uvadite, ze musite manipulovat s @INC
, a to bud pres -I
nebo pomoci use lib
(primo se hrabat v @INC
neni dobry napad). Do tohoto muzete vice nahlidnout napr. v kapitole 12 perl cookbook. Konkretne v Keeping Your Own Module Directory se toto podrobne rozebira, vcetne metody jak "uhodnout" cestu ke skriptu pomoci modulu FindBin
.
Co se tyce nalezeni obecneho souboru v ramci vaseho modulu, doporuciji pouzit hash %INC
, kde naleznete cestu, pres kterou se tento modul nasel. Napr. $INC{'Vas::Modul.pm'}
.
Jak se na to tak divam, tak to jednou vyda na dalsi dil meho serialu
readlink
a -l
, z toho už cestu poskladáš
tretia možnosť: export PERL5LIB="/home/aaa/lib/perl5:/home/aaa/test/lib/perl5"
use FindBin qw($RealBin); use lib $RealBin; use MujModul; my ($root) = $INC{'MujModul.pm'} =~ /(.*)\//; … my $soubor = "$root/soubor.xxx";Ještě jednou děkuji!
my ($root) = $INC{'MujModul.pm'} =~ /(.*)\//;
Tuhle vec muzete udelat take pomoci File::Basename nebo neco takovyho a bude to prenositelny i na jiny systemy nez unix. Jinak ten postup je vicemene to co jsem se snazil naznacit. :)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.