Zależności w Perlu (było: SPECS: perl-Video-DVDRip.spec (HEAD) [ankry])

Radoslaw Zielinski radek w karnet.pl
Pon, 5 Sie 2002, 22:53:00 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

( Wiem, że początek wielu z Was nie interesuje, ale pod koniec jest
  konkretne pytanie, dotyczące polityki PLD w zakresie modułów Perla
  (nie tylko pakietów perl-*). )


[[ Andrzej Krzysztofowicz <ankry w green.mif.pg.gda.pl> (cytując Kloczka) ]]:
>> Tu mie się wydaje że to jest błą jednak źle tutaj poprawiany.
>> Wystarczy zajrzęć o plików z /usr/lib/perl5/site_perl/Video/DVDRip/GUI/Project
[...]

Tomku, swoim mailem podsunałeś mi pomysł na prawidłowe rozwiązanie
perl.prov, nad czym zastanawiałem się od kilku dni i właśnie miałem
dać sobie spokój.  :-))  Dlaczego moja wredna morda się uśmiecha?
Pozwolę sobie na dłuższe wyjaśnienie...

W Perlu aktualną domyślną przestrzeń nazw definiuje się poleceniem
`package nazwa::przestrzeni::nazw;'.  Wszystko, co następuje później (do
następnego `package' lub końca bloku/pliku)) i nie jest ściśle określone,
przynależy właśnie do tej przestrzeni.

Domyślnie, domyślną jest "main::".

Polecenie `package' nie musi wystąpić, żeby coś zostało przypisane do
innej przestrzeni niż domyślna; taka składnia jest legalna (tak wygląda
,,ścisłe określanie'' / kwalifikowanie):

    sub Foo::Bar::funkcja {}
    $Foo::Bar::zmienna

Żeby dołożyć problemów z parsowaniem, można także nadpisywać już
istniejące obiekty.  Stosuje się to głównie przy dziedziczeniu; np
w Apache::DBI (dziedziczy po DBI); bardziej obrazowe przykłady:

    use CGI 'header';  # eksport funkcji header() z modułu CGI
    sub CGI::header {} # nadpisanie CGI::header

     $ perl -MCGI=header -e '$_=header; chomp; print'                
    Content-Type: text/html; charset=ISO-8859-1
     $ perl -MCGI=header -le 'sub CGI::header {"foo"}; print header'
    foo

Aktualny parser szuka polecenia `package', znajdującego się na początku
linii (problem, gdy ktoś ma fantazję ujmować całą definicję pakietu w
nawiasy klamrowe: "{ package foo;\n") i szuka wersji.  Nie sprawdza się
to choćby w przypadku omawianego perl-Video-DVDRip -- w Provides wpada
choćby perl(DB) (nie widzę sensu w odpowiednim kawałku kodu, szczerze
powiedziawszy, ale patrzałem tylko przez chwilę).

> W wielu miejscach sciezka do modulu nie pokrywa sie z wewnetrzna nazwa
> modulu. Ba, w paru przypadkach kilka modulow (o roznych nazwach
> wewnetrznych) jest umieszczonych w *jednym* pliku...

> Moze tak powinno byc ?

Tak może być; powinność ma tu niewiele do rzeczy.  Przy czym rzeczywiste
moduły Perla, te z CPANu i instalowane w /usr/lib/perl*, moim prywatnym
zdaniem powinny udostępniać przestrzeń nazw pasującą do ścieżki do pliku
- -- w tym pliku.  Plus ewentualne podklasy.

W praktyce, w pliku może być cokolwiek.  Przykład:

     $ cat Foo.pm
    package Foo;
    print "Foo\n";
    1;
     $ perl -MFoo -e ''
    Foo
     $ cat Bar.pm 
    package Fnord;
    print "Fnord, znajdujący się w Bar.pm\n";
    1;
     $ perl -MBar -e ''
    Fnord, znajdujący się w Bar.pm

Jednak nie można wykonać `(use|require) bareword', gdzie "bareword" nie
przekłada się na nazwę pliku; nawet, jeśli perl wie już o tym pliku:

     $ perl -MBar -MFnord -e ''
    Fnord, znajdujący się w Bar.pm
    Can't locate Fnord.pm in @INC [...]

W przypadku perl-Video-DVDRip, do Provides powinno wpadać tylko
to, co jest wyświetlane przez polecenie (po wejściu do rozpakowanego
archiwum):

$ find lib -name \*.pm|perl -pe 's,^lib/|\.pm$,,g;s,/,::,g;s,^,perl(,;s,$,),'

plus odpowiednie numery wersji.



Rozwiązanie: nie należy szukać po `package', (chyba, że numerów wersji).
Wystarczy rozpoznawanie listy plików.  Wylecą wtedy zbędne informacje
o perl(klasa::podklasa::foo), gdzie to coś jest zdefiniowane w pliku
klasa/podklasa.pm.  Zaimplementuję to... na dniach.



Tu pojawia się jeszcze jeden problem, ale już mniejszego kalibru i
związany raczej z polityką w dystrybucji (Panowie, postarajcie się to
tym razem ustalić wyczerpująco i do końca), a mianowicie:

  _Czy w PLD moduły Perla mogą być instalowane poza /usr/lib/perl*?_

Dlaczego tak?  Bo niekiedy są to biblioteki prywatne jakichś aplikacji,
zapisane w formie *.pm (i ewentualnie opakowane Makefile.PL) dla
czytelności.  Przykład: RT, <http://www.bestpractical.com/rt/>; to
bardzo smacznie wyglądający BTS, wdrażany obecnie przez developerów Perla
(niedługo wrzucę speca).

Dlaczego nie?  Bo im też wypadałoby oznaczyć Provides/Requires,
a bez sensu jest udostępnianie informacji o wirtualnej właściwości
perl(foo::bar), gdy normalna aplikacja nie ma możliwości znalezienia
tego foo::bar.  No i implementacja perl.prov się komplikuje (ale to
akurat jest do rozwiązania).


Ja jestem za ,,nie'': jest prostrze, a mniej kombinowania, to mniej
problemów.

> A moze rpm-perlprov z DEVEL obsluguja to juz inaczej ?

To prawie ten sam skrypt.


ps.  Czy kombinowanie z Epoch w perl.req z DEVEL (po zapatchowaniu linie
255-262) to wymysł (c) PLD, czy można pominąć?

- -- 
Radosław Zieliński <radek w karnet.pl>
[ GPG key: http://radek.karnet.pl/ ]

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)

iD8DBQE9TuWgvesRuUOywuARAisIAKDavBRJdtWVYPaJvVBxY9ROjbPyCgCgtQVI
Q0kvvZna3p6N0EpWBIlAkck=
=iIl7
-----END PGP SIGNATURE-----



Więcej informacji o liście dyskusyjnej pld-devel-pl