2017-07-03 79 views
9

Bar.pm, ben bir otorite (yazar) ve bir versiyonu ile bir sınıf bildirmek: Bir programda kullanırsanızPerl 6 modülünün sürümünü ve otoritesini nasıl bulabilirim?

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

, nasıl görüyorsun ben bir modülün hangi sürümünün kullanarak, kim yazdı ve modül yükleyicisi nasıl buldu? Her zaman olduğu gibi, belgelere bağlantılar önemlidir. Bu soru perl6-users numaralı telefondan da sorulmuştur, ancak tatmin edici bir cevap (veya dokümanlar için bağlantılar) ortaya çıkmadan önce ölmüştür.

Bu sorundaki başka bir kırışıklık, birçok kişinin bu bilgileri sınıflarına veya modül tanımlarına eklememesidir. Bu kod, META.json dosyasında görünür.

+1

["auth", "yazar" değil "auth" dir (https://irclog.perlgeek.de/perl6/2017-04-20#i_14460369). – raiph

+1

"[auth] bilgisi ... META.json dosyasında ancak kodu göstermiyor." [TimToady, bu problem üzerinde] (https://irclog.perlgeek.de/perl6/2017-04-20#i_14460332): "Bir modül yandığında yeni bir sürümü zorla ... Ben düzeltmek için jnthn için bir pr gönderdi bir hata, ancak yama düzeyini artırmayı unutmuş, bu yüzden zef görmüyor ... ad/ver/auth [must] resmi bir kütüphaneye yüklendiğinde benzersiz bir metne karşılık geliyor [OR] bir [kripto] hash kısmını kimliğinin [OR] git revision ... benzersiz bir şekilde aradığınız "doğru" sürümünü isimlendiremezseniz bir kabus olacak. " – raiph

cevap

9

(Muhtemelen bir doyurucu cevap, maddenin gerçekler ... değil özellikle dokümantasyon durumuna dair, ama burada gider, çok tatmin edici oldukları için)


ise modül veya sınıf la class Bar:auth<Camelia>:ver<4.8.12> bir kaynak kod doğrudan sürüm, daha sonra içe herhangi bir kod bunu introspect olabilir:

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

  • Metamodel::ClassHOW(yani dokümantasyon sayfasından henüz bunları söz etmez rağmen)
  • Metamodel::ModuleHOW(yani dokümantasyon sayfasından hiç henüz yok rağmen)
  • : o ver ve auth yöntemler tarafından sağlanmaktadır

Ne yazık ki, meta-nesne şu anda almak için bir yol sağlar sanmıyorum Modül/sınıfın kaynak yolu. elle use ve require derleme birimleri yüklemek alması adımını atmaya
, en az (yani vb $PERL6LIB veya use lib veya -I den hangi konumu elde yüklendi) önek yolda alabilirsiniz:

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, CompUnit türünde bir nesnedir.
$comp-repo, CompUnit::Repository::FileSystem'dir.
Her iki belge sayfası henüz mevcut değil ve $*REPO yalnızca list of dynamic variables numaralı belgede belirtilmiştir.

if try $comp-unit.distribution.meta -> %dist-meta { 
    say %dist-meta<ver>; 
    say %dist-meta<auth>; 
    say %dist-meta<license>; 
} 
: modül düzgün set-up distribution parçasıysa


, sen onun META6.json (Bahsettiğiniz posta listesi dizisindeki as posted by Lloyd Fournier) tanımlanan meta bilgi de alabilirsiniz

+1

CompUnit öğelerini daha ayrıntılı olarak araştırmak istiyorum, ancak bu cevabın aldığı kadar iyi olduğunu düşünüyorum. Temelde aynı şeylerle geldim. Teşekkürler! –