2009-06-08 11 views
5

Jak mogę znaleźć standardową lokalizację site_perl (non-arch)? Czy można bezpiecznie przechodzić w pętlę @INC i znaleźć ścieżkę kończącą się "site_perl" lub czy istnieje standardowy sposób, aby to zrobić?Jak znaleźć standardowy katalog site_perl dla Perla?

Powodem, dla którego próbuję to znaleźć, jest bardzo duży projekt zbudowany z setek pojedynczych modułów, wszystkie z własnymi plikami Makefile.PL (prawie każdy plik .pm został zbudowany jako własny styl CPAN moduł). Wraz z tym, każdy moduł może mieć artefakty (szablony, pliki .cgi itp.) W różnych lokalizacjach, wszystkie które muszą być rozmieszczone w różnych lokalizacjach, nic nie jest standardem. Jest to pierwszy krok do próby opanowania tego, w zasadzie posiadający jeden plik Makefile, który może znaleźć i wdrożyć wszystko, następnym krokiem będzie dostanie go w rozsądny układ w kontroli wersji.

Spędziłem czas próbując to zrobić przy użyciu standardowych narzędzi instalacyjnych, ale nie miałem szczęścia.

+1

Dlaczego szukasz site_perl? Jeśli powiesz nam, co próbujesz zrobić, prawdopodobnie możemy Ci powiedzieć, jak to zrobić. :) –

Odpowiedz

7
C:\Temp> perl -MConfig -e "print qq{$_ => $Config{$_}\n} for grep { /site/ } keys %Config" 

    d_sitearch => define 
    installsitearch => C:\opt\perl\site\lib 
    installsitebin => C:\opt\perl\site\bin 
    installsitehtml1dir => 
    installsitehtml3dir => 
    installsitelib => C:\opt\perl\site\lib 
    installsiteman1dir => 
    installsiteman3dir => 
    installsitescript => C:\opt\perl\site\bin 
    sitearch => C:\opt\perl\site\lib 
    sitearchexp => C:\opt\perl\site\lib 
    sitebin => C:\opt\perl\site\bin 
    sitebinexp => C:\opt\perl\site\bin 
    sitehtml1dir => 
    sitehtml1direxp => 
    sitehtml3dir => 
    sitehtml3direxp => 
    sitelib => C:\opt\perl\site\lib 
    sitelib_stem => 
    sitelibexp => C:\opt\perl\site\lib 
    siteman1dir => 
    siteman1direxp => 
    siteman3dir => 
    siteman3direxp => 
    siteprefix => C:\opt\perl\site 
    siteprefixexp => C:\opt\perl\site 
    sitescript => 
    sitescriptexp => 
    usesitecustomize => define 

Albo, jak @ysth zwraca uwagę w komentarzach, można użyć:

C:\Temp> perl -V:.*site.* 

na Windows i

$ perl '-V:.*site.*' 

w * nix muszli.

1

Pętla nad @INC nie jest bezpieczna, ponieważ może być modyfikowana przez kod lub środowisko, a zatem może zawierać wiele katalogów, które kończą się na site_perl.

Jeśli próbujesz określić, gdzie dany moduł jest zainstalowany, użyj %INC.

+0

Nie, próbuję znaleźć gdzie zainstalować konkretny moduł. Mam wysoki poziom kontroli nad celami instalacji, ale nie mogę na tym etapie zmienić @INC, ani ze względu na złożoność mogę używać MakeMaker/etc. –

+0

perl -V | grep sitelib szuka wartości -Dsitelib = wartość –

+0

@Chas. Owens: installsitelib, a nie sitelib – ysth

2

Po prostu uruchom perl -V. Na końcu wydrukuje domyślny @INC.

5

Czy istnieje powód, aby nie używać jednego z instalatorów modułów (ExtUtils::MakeMaker, Module::Build, Module::Install)?

Ale jeśli musisz, katalog jest dostępny (po załadowaniu Config) jako $Config::Config{'installsitelib'}. Zauważ, że niektóre platformy mogą konfigurować perl w taki sposób, że katalog ten nie pojawia się dosłownie w @INC, zamiast tego ma inny katalog, który jest dowiązany do katalogu installsitelib.

Powiązane problemy