2017-07-03 12 views
9

W Bar.pm oświadczam klasę z organem (autor) i wersji:Jak znaleźć wersję i uprawnienia modułu Perl 6?

class Bar:auth<Camelia>:ver<4.8.12> { 
    } 

Jeśli używam go w programie, w jaki sposób mogę sprawdzić, która wersja modułu jestem używając, kto to napisał i jak znalazł ją moduł ładujący moduły? Jak zawsze ważne są linki do dokumentacji.

To pytanie było również zadawane na perl6-users, ale zmarł, zanim pojawiła się satysfakcjonująca odpowiedź (lub linki do dokumentów).

Inną wadą tego problemu jest to, że wiele osób nie dodaje tych informacji do swoich definicji klas lub modułów. Pojawia się w pliku META.json, ale nie zawiera kodu.

+1

["auth" to "auth", a nie "author"] (https://irclog.perlgeek.de/perl6/2017-04-20#i_14460369). – raiph

+1

"Informacja [auth] ... pojawia się w pliku META.json, ale nie w kodzie." [TimToady, w sprawie tego problemu] (https://irclog.perlgeek.de/perl6/2017-04-20#i_14460332): "wymuszanie nowej wersji po zainstalowaniu modułu ... Wysłałem pr jnthn do naprawy błąd, ale zapomniałem podkręcić poziom patcha, więc zef go nie widzi ... name/ver/auth [musi] odpowiada unikalnemu tekstowi, jeśli jest zainstalowany w oficjalnej bibliotece [OR] zawiera skrót [krypto] jako część tożsamości [OR] git rewizji ... to będzie koszmar, jeśli nie możesz nazwać "poprawnej" wersji, której szukasz w wyjątkowy sposób ". – raiph

Odpowiedz

9

(Prawdopodobnie nie jest to satysfakcjonująca odpowiedź, ponieważ stan faktyczny sprawy nie są bardzo satysfakcjonujące, zwłaszcza w odniesieniu do stanu z dokumentacją, ale tu idzie ...)


Jeśli moduł lub klasę wersjonowanych bezpośrednio w kodzie źródłowym à la class Bar:auth<Camelia>:ver<4.8.12>, następnie każdy kod, który importuje może go introspect:

use Bar; 

say Bar.^ver; # v4.8.12 
say Bar.^auth; # Camelia 

# ...which is short for: 
say Bar.HOW.ver(Bar); # v4.8.12 
say Bar.HOW.auth(Bar); # Camelia 

T on ver i auth metody są dostarczane przez:


Niestety, nie sądzę, meta-obiektu przewiduje obecnie sposób, aby w ścieżka źródłowa modułu/klasy.
By ręcznie przechodząc przez etapy, które use i require podjąć, aby załadować jednostki kompilacji, można przynajmniej dostać na ścieżce prefiksu (tj który lokalizacja z $PERL6LIB lub use lib lub -I itp którego został wczytany):

my $comp-spec = CompUnit::DependencySpecification.new: short-name => 'Bar'; 
my $comp-unit = $*REPO.resolve: $comp-spec; 
my $comp-repo = $comp-unit.repo; 
say $comp-repo.path-spec; # file#/home/smls/dev/lib 
say $comp-repo.prefix;  # "/home/smls/dev/lib".IO 

$comp-unit to obiekt typu CompUnit.
$comp-repo to CompUnit::Repository::FileSystem.
Obie strony dokumentacji nie istnieją, a $*REPO jest krótko wymienione w list of dynamic variables.


Jeśli moduł jest częścią prawidłowo set-up distribution, można uzyskać na meta-informacji określonej w swojej META6.json(as posted by Lloyd Fournier w wątku listy mailingowej pan wspomniał):

if try $comp-unit.distribution.meta -> %dist-meta { 
    say %dist-meta<ver>; 
    say %dist-meta<auth>; 
    say %dist-meta<license>; 
} 
+1

Chciałbym zbadać rzeczy CompUnit bardziej szczegółowo, ale myślę, że ta odpowiedź jest tak dobra, jak to tylko możliwe. Zasadniczo wymyśliłem te same rzeczy. Dzięki! –