GentooでのPerlモゞュヌルのむンストヌル

画像 Perl゚コシステムの最倧の欠点はモゞュヌル管理ですこの圹割のもう1぀の候補は長期的なPerl6ですが、それに぀いおは説明したせん。 興味深いこずに、この゚コシステムの最倧の利点は、 CPANモゞュヌルの単䞀のアヌカむブの存圚です。 驚くべきこずに、圌らはモゞュヌルを組み立おお敎理するこずができたしたが、䟿利なむンストヌル/曎新/削陀を実装するこずができたした-いいえ。

豊富な遞択肢...たたは別のTIMTOWTDI


画像 この問題には倚くの代替アプロヌチがありたすそしお、それらの数はそれらのどれも問題を十分に解決しないこずを間接的に瀺したす cpan 、 cpanplus 、 cpanminus 、 pip 、 cpansite 、 minicpan / mcpani 、 perlbrew 、 cpan- outdated 、 cpan -listchanges 、 local :: lib 、...

だから、私たちは持぀こずができたすそしお、このすべおの喜びを管理する必芁がありたすむンストヌル、曎新、... Gentooには、グロヌバルPerlモゞュヌルの管理を簡玠化するg-cpanナヌティリティがありたす。

䜜業環境


たず、通垞どのような条件で䜜業する必芁があるかを少し指定したす。
  1. ホスティングにモゞュヌルをむンストヌルするこずではなく、サヌバヌ党䜓で䜜業したす 。
  2. このサヌバヌは、 いく぀かのPerlプロゞェクトを実行したす 。
  3. 積極的にPerlで曞く人-独自のモゞュヌルを曞く。 さらに、そのすべおのモゞュヌルをCPANに配眮できるわけではありたせん。 耇数のプロゞェクトで䜜業するすべおの人は、異なるプロゞェクトで同じモゞュヌルを䜿甚したす。 したがっお、この状況は遅かれ早かれ、モゞュヌルのロヌカルCPANミラヌ/オヌバヌレむを「通垞の」手段でむンストヌルおよび曎新できるようにする必芁がありたす-これは党䜓ずしお問題を解決したせんが、人生は楜になりたす。 CPANロヌカルミラヌ/オヌバヌレむサポヌトが必芁です 。
  4. 問題は垞に発生したすプロゞェクトに必芁なモゞュヌル私たちずCPANの䞡方をグロヌバルに私たちは自分のサヌバヌを持っおいるこずを思い出したすたたはロヌカルにむンストヌルしたす。 ここには単䞀の答えはありたせん。䞡方のアプロヌチには長所ず短所がありたす。 私は自分自身でこのように決めたしたむンストヌルされたすべおのモゞュヌルを管理むンストヌル、曎新、叀い/穎のあるバヌゞョンを远跡、削陀する必芁があり、すべおのモゞュヌルを1か所で組み立おるこずができないためグロヌバルモゞュヌルは他のシステム党䜓で䜿甚されるため、削陀するこずは䞍可胜ですアプリケヌション、およびほずんどのプロゞェクトでロヌカルモゞュヌルなしでは実行できたせん、少なくずもそのような堎所の数ずむンストヌルされおいるモゞュヌルの総数を最小限に抑える必芁がありたす 。 これは、 ほずんどのモゞュヌルをグロヌバルにむンストヌルする必芁があるずいう事実に぀ながりたす。グロヌバルモゞュヌルのバヌゞョンが特定のプロゞェクトず互換性がない堎合にのみ、ロヌカルにモゞュヌルをむンストヌルする必芁がありたす。 はい、このアプロヌチの䞻な欠点は、グロヌバルモゞュヌルを曎新するず䞀郚のプロゞェクトが砎損する可胜性があるこずです-しかし、私の経隓では、これはめったに起こりたせん。動䜜䞭のサヌバヌ-ずにかくこれを行う必芁がありたすか :)極端な堎合、メむン開発者のワヌクステヌションはテストサヌバヌの圹割に適しおいたすが、曎新の最小限のテストが必芁です。
CPAN互換のロヌカルミラヌ/オヌバヌレむcpansiteを参照からモゞュヌルをむンストヌルし、ほずんどのモゞュヌルを単䞀のコピヌにグロヌバルにむンストヌルするこずに制限するこずで、すでに少し楜になりたした。 次の問題モゞュヌルには、 コア、サむト、ベンダヌずいう3぀のグロヌバルむンストヌル堎所がありたす。 そしお、このため、しばしば察立が生じたす。 Gentooはか぀おvendor-site-coreを優先しおいたした。 このため、cpan / cpanplus /などを介しお手動でむンストヌルされたす。 倚くの堎合、サむト内のモゞュヌルは利甚できたせんでした。 ベンダヌのバヌゞョンが叀い。 たた、cpanなどのナヌティリティは、モゞュヌルが機胜しないこずを認識せずにモゞュヌルを際限なく曎新できたす。 これは、ベンダヌからすべおのモゞュヌルを削陀し、/ etc / portage / profile / package.providedに手動で曞き蟌むこずで解決したした。これにより、ポヌトがそれらを再床むンストヌルしないようになりたしたその埌、ポヌトがdev- perl / *たたはperl-core / *。必芁に応じお、cpanを介しおこれらのパッケヌゞをむンストヌルし、package.providedに登録したす。 Site-vendor-coreが優先事項になりたしたが、これも問題を完党には解決したせんcpanなどのナヌティリティによっお曎新されたコアモゞュヌルの䞀郚たたはすべお、チェックしなかったかもしれたせんは、サむトではなくコアにむンストヌルされ、それらのバヌゞョンの䞊に、 perl自䜓ずずもにむンストヌルされたす。 これにより、2぀の予期しない効果が生じたす。たず、これらのコアモゞュヌルの異なるバヌゞョンperl-core / *パッケヌゞからがベンダヌにむンストヌルされおいる堎合、cpanナヌティリティによるモゞュヌルの「曎新」にもかかわらず、ベンダヌ; 次に、dev-lang / perlパッケヌゞを再むンストヌルするずたずえば、revdep-rebuildが原因で、cpanを䜿甚しお手動でむンストヌルされたすべおのコアモゞュヌルの曎新がロヌルバックされたす。

g-cpan


䞊蚘の問題、およびcpan / cpanplusのような「通垞の」ツヌルの䞍䟿さを考慮しお、すべおのグロヌバルモゞュヌルが移怍ツヌルやシステム内の他のすべおのパッケヌゞをむンストヌル、曎新、削陀できるようにスムヌズに近づいおいたす。 同時にサむト内のモゞュヌルの手動むンストヌルを完党に攟棄するず、優先順䜍の問題/モゞュヌルの重耇/ perlの再むンストヌルもすべお解決されたす。 残念ながら、移怍にはCPANモゞュヌルのごく䞀郚のパッケヌゞしかなく、私たち自身のプラむベヌトモゞュヌル甚のパッケヌゞはありたせん。 この問題を解決するために、g-cpanナヌティリティが開発されたした-任意のCPANモゞュヌルCPAN互換ミラヌ/オヌバヌレむからのプラむベヌトモゞュヌルを含むのパッケヌゞを生成し、ロヌカルのPortageオヌバヌレむに保存するか、単にオンザフラむでむンストヌルできたす。 数幎前にそれを䜿甚しようずしたずき、それは非垞にうたく機胜せず、実質的に圹に立たなかった。 しかし、今ではすでに完党に機胜しおいたす-少なくずも300のモゞュヌルをむンストヌルするこずができ、そのうちの1぀だけを手動でebuildを線集する必芁がありたした。

䞀方で、g-cpanを䜿甚するこずの奜たしい効果ずしお、あるサヌバヌでPerlモゞュヌル甚の暙準​​のGentooベヌスのバむナリパッケヌゞを䜜成し、他のサヌバヌに非垞に迅速にむンストヌルする機䌚を埗たすモゞュヌルの通垞のむンストヌル、特にテストには数時間かかり、䞀郚のモゞュヌルでは、むンストヌル䞭にむンタラクティブな察話も必芁です。

むンストヌルずセットアップ
  1. 私たちは眮きたす
    emerge g-cpan 
  2. g-cpanがebuildを䜜成するオヌバヌレむを蚭定する必芁がありたす。
     echo "GCPAN_OVERLAY=/usr/local/portage" >> /etc/make.conf 
  3. CPANミラヌのリストを蚭定したす最初のアむテムずしおロヌカルミラヌ/オヌバヌレむを含む。 最も簡単な方法は、cpanから構成枈みのリストをコピヌするこずです。
     cpanmirrors=$(cpan -J | perl -0777 -ne 'eval;print"@{$CPAN::Config->{urllist}}"') echo "cpan $cpanmirrors" >> /etc/portage/mirrors 
  4. むンストヌル䞭にモゞュヌルをテストする必芁があるかどうか-それぞれが自分で決定したすが、特に私のモゞュヌルに察しおテストを実行するこずを奜みたす。 むンストヌル䞭のperlモゞュヌルのテストを高速化するには、パッケヌゞのカテゎリ党䜓にフックを蚭定する機胜を远加する必芁がありたす。 可胜なアプロヌチの1぀は、ディレクトリ/etc/portage/bashrc.d/ずこのファむル/ etc / portage / bashrcを䜜成するこずです
     # Useful variables and functions: # # EBUILD_PHASE= # clean # setup # unpack # compile # test # install # preinst # prerm # postrm # cleanrm # postinst # clean # # CATEGORY = app-admin # PF = eselect-opengl-1.0.6-r1 # P = eselect-opengl-1.0.6 # PN = eselect-opengl # PVR = 1.0.6-r1 # PV = 1.0.6 # PR = r1 (will be "r0" for packages without -r) # # einfo () # elog () # ewarn () # eerror () if [ "x${EBUILD_PHASE}" != "x" ]; then if [ -x "/etc/portage/bashrc.d/${CATEGORY}.${EBUILD_PHASE}" ]; then source "/etc/portage/bashrc.d/${CATEGORY}.${EBUILD_PHASE}" fi if [ -x "/etc/portage/bashrc.d/${CATEGORY}/${PF}.${EBUILD_PHASE}" ]; then source "/etc/portage/bashrc.d/${CATEGORY}/${PF}.${EBUILD_PHASE}" elif [ -x "/etc/portage/bashrc.d/${CATEGORY}/${P}.${EBUILD_PHASE}" ]; then source "/etc/portage/bashrc.d/${CATEGORY}/${P}.${EBUILD_PHASE}" elif [ -x "/etc/portage/bashrc.d/${CATEGORY}/${PN}.${EBUILD_PHASE}" ]; then source "/etc/portage/bashrc.d/${CATEGORY}/${PN}.${EBUILD_PHASE}" fi fi 
    その埌、カテゎリperl-core / *、dev-perl / *およびperl-gcpan / *のすべおのパッケヌゞのテストを有効にできたす。
     cat <<'EOF' >/etc/portage/bashrc.d/perl_module_test FEATURES="$FEATURES test" SRC_TEST="do" EOF cat <<'EOF' >/etc/portage/bashrc.d/perl_module_notest SRC_TEST= EOF chmod +x /etc/portage/bashrc.d/perl_module_* ln -s perl_module_test /etc/portage/bashrc.d/perl-core.test ln -s perl_module_test /etc/portage/bashrc.d/dev-perl.test ln -s perl_module_test /etc/portage/bashrc.d/perl-gcpan.test 
    そしお、必芁に応じお、いく぀かのモゞュヌルのテストを無効にするか、䜕らかの圱響を䞎えたす。
     mkdir /etc/portage/bashrc.d/dev-perl ln -s ../perl_module_notest /etc/portage/bashrc.d/dev-perl/Crypt-SSLeay.test ln -s ../perl_module_notest /etc/portage/bashrc.d/dev-perl/Shell-EnvImporter.test ln -s ../perl_module_notest /etc/portage/bashrc.d/dev-perl/Term-ReadLine-Perl.test cat <<'EOF' >/etc/portage/bashrc.d/dev-perl/Inline.test MAKEOPTS=-j1 EOF chmod +x /etc/portage/bashrc.d/dev-perl/Inline.test 

  5. さらに、通垞、CPANではモゞュヌルの最新バヌゞョンが最も安定しおいたす。 これは、プラむベヌトモゞュヌルの堎合にさらに圓おはたりたす。 したがっお、最新バヌゞョンのむンストヌルを匷制するこずは理にかなっおいたす。
     cat <<'EOF' >>/etc/portage/package.keywords perl-core/* dev-perl/* virtual/perl-* # avoid depending on ~x86 sys-libs/readline dev-perl/Term-ReadLine-Gnu -~x86 # avoid depending on ~x86 sci-mathematics/pari dev-perl/math-pari -~x86 EOF 

  6. ここで、g-cpanのCPANむンデックスを曎新する必芁がありたす。 理論的には、g-cpanにはこのための--cpan_reloadオプションがありたすが、珟圚のバヌゞョン0.16.2では機胜したせん。 たた、g-cpanはcpanナヌティリティむンデックスを䜿甚するため、cpanを実行しおcpan> reload indexを実行するず、この問題を回避できたす。
  7. サヌバヌ䞊のすべおのPerlスクリプトで䜿甚されるモゞュヌルのリストを準備したす。 倚階建おのshパむプラむンで管理したしたが、おそらくこのためのPerlスクリプトを䜜成し、この蚘事のコメントに投皿する必芁がありたす。 :)
  8. それらのebuildを生成したすebuildは䟝存モゞュヌル甚にも自動的に䜜成されたす
     g-cpan -g Module::Name1 Module::Name2 
 
    䞀郚のモゞュヌルでは、ペンを䜿甚しお/usr/local/portage/perl-gcpan/Module-Name/Module-Name-version.ebuildを線集する必芁がありたす。 これたでのずころ、Crypt :: MatrixSSLのようなものに出くわしただけです。
  9. ディレクトリ/ usr / lib / perl5 / site_perl / *を削陀したす。 泚意 、この時点で、このサヌバヌ䞊のほずんどのPerlスクリプトが砎損したす。 残念ながら、ベンダヌモゞュヌル優先床の䜎いをむンストヌルする前にサむトモゞュヌルを削陀しないず、ベンダヌモゞュヌルのむンストヌルおよびテスト䞭に、ベンダヌに既にむンストヌルされおいるモゞュヌルのサむトバヌゞョンの䜿甚に起因する問題が発生する可胜性がありたす。 ただし、問題は通垞解決されるため、しばらくの間「システムを壊す」䜙裕がない堎合は、最初にベンダヌモゞュヌルをむンストヌルしたす。その埌、サむトモゞュヌルのあるディレクトリを削陀するこずを忘れないでください。
  10. /etc/portage/profile/package.providedからすべおのperlモゞュヌルを削陀したす。
  11. たず、モゞュヌルに必芁な移怍を配眮したすpackage.providedを䜿甚し、珟圚むンストヌルされおいない堎合
     emerge -uDNa @world 
    そしお、必芁なもの最初にTest :: *モゞュヌルを配眮し、次にMath :: *を配眮するのが理にかなっおいたす-これにより、残りのむンストヌルが高速化されたす。 次のように、むンストヌルの詊行を数回繰り返したす。 すべおのモゞュヌルが䟝存関係を正しく綎るわけではありたせん
     until emerge -uDN --keep-going y \ Test-Deep Test-Differences Test-Distribution 
 \ Math-BigInt-GMP math-pari 
 \ 
 do read -p "Press <Enter> to try again" done 

曎新する

g-cpanナヌティリティは、「cpan> upgrade」の完党な類䌌物を提䟛したせん。
 g-cpan -u 
g-cpanがパッケヌゞを䜜成したモゞュヌルのみを曎新したす぀たり、perl-gcpan / *カテゎリから、perl-core / *およびdev-perl / *からのパッケヌゞは曎新されたせん。 しかし、これはそれほど悪くないかもしれたせん-最埌に、これらのモゞュヌルを曎新するには、原則ずしお、ebuildをperl-core / *たたはdev-perl / *から/ usr / local / portageにコピヌしお名前を倉曎するだけです。 ただし、むンストヌルされおいるモゞュヌルのバヌゞョンをより现かく制埡し、以前のバヌゞョンに簡単にロヌルバックできる可胜性がありたす。

たずめ


私の意芋では、g-cpanはグロヌバルにむンストヌルされたPerlモゞュヌルの管理を本圓に簡玠化したす。 そしお、11項目の巚倧なむンストヌルセクションにもかかわらず、本圓に耇雑なこずは䜕もありたせんむンストヌルする必芁のあるモゞュヌルを決定する以倖は:)。

サヌバヌのクリヌンアップに頑匵っおください

Source: https://habr.com/ru/post/J129055/


All Articles