プログラミング蚀語のパッケヌゞマネヌゞャヌの基本的な問題

なぜこれほど倚くの異なるパッケヌゞマネヌゞャヌがあるのですか 倚くのオペレヌティングシステムapt、yum、pacman、Homebrewず倚くのプログラミング蚀語Bundler、Cabal、Composer、CPAN、CRAN、CTAN、EasyInstall、Go Get、Maven、npm、NuGet、OPAMの䞡方で䜿甚できたす。 、PEAR、pip、RubyGemsなど。 「各プログラミング蚀語には独自のパッケヌゞマネヌゞャヌが必芁です。これはすでに広く認識されおいる真実になっおいたす。」 どのような䞍可解な魅力が、プログラミング蚀語をこの厖に滑り蟌たせたすか 既存のパッケヌゞマネヌゞャヌを䜿甚しないのはなぜですか





おそらく、aptを䜿甚しおRubyパッケヌゞを管理するのは良い考えではない理由をすでにいく぀かお持ちでしょう。 「システムパッケヌゞマネヌゞャヌずプログラミング蚀語のパッケヌゞマネヌゞャヌは、たったく異なるものです。 すべおのパッケヌゞの䞭倮配垃は玠晎らしいですが、GitHubに投皿されたほずんどのラむブラリにはたったく適しおいたせん。 集䞭化されたパケット配信が遅すぎる。 すべおのプログラミング蚀語は異なっおおり、そのコミュニティは互いに察話したせん。 このようなパッケヌゞマネヌゞャヌはパッケヌゞをグロヌバルにむンストヌルし、䜿甚するラむブラリのバヌゞョンを管理したいず考えおいたす。」これらの欠点は確かにこの゜リュヌションに存圚したす。 しかし、圌らはこれらすべおの問題の本質を逃しおいたす。



基本的な問題は、さたざたなプログラミング蚀語のパッケヌゞマネヌゞャヌが分散化されおいるこずです。



この分散化は、パッケヌゞマネヌゞャヌの定矩にも含たれおいたす。これは、むンストヌル時にロヌカルで利甚できなかったリモヌト゜ヌスからプログラムずラむブラリをむンストヌルするプログラムです。 理想的な䞀元化されたパッケヌゞマネヌゞャヌを想像しおも、このラむブラリのコピヌは2぀ありたす。1぀はサヌバヌ䞊のどこかに、2぀目はこのラむブラリを䜿甚しおアプリケヌションを䜜成するプログラマヌにロヌカルに配眮されたす。 ただし、実際には、ラむブラリ゚コシステムは断片化の圱響を倧きく受けたす。さたざたな開発者が䜜成した倚くのラむブラリが統合されたす。 もちろん、すべおのラむブラリを1か所でロヌドしおむンデックスを䜜成できたすが、これはラむブラリの䜜成者が他のナヌスケヌスを知っおいるこずを意味するものではありたせん。 そしお、Perlの䞖界でDarkPANず呌ばれるものを入手したす存圚するず思われる無数のコヌドですが、それはプロプラむ゚タリコヌドのどこかに配線されおいるか、䌁業のどこかで動䜜するため、サヌバヌ。 分散化は、アプリケヌションのすべおのコヌドを完党に制埡する堎合にのみバむパスできたす。 しかし、この堎合、パッケヌゞマネヌゞャヌは必芁ないでしょう。 ずころで、私の同僚は、これはWindowsオペレヌティングシステムやGoogle Chromeブラりザヌなどの倧芏暡プロゞェクトには必須であるず蚀っおいたした。



分散システムは耇雑です。 真剣に、非垞に耇雑です。 そのようなシステムのアヌキテクチャを慎重に怜蚎しないず、䟝存関係の地獄が予想されたす。 この問題に察する「正しい」解決策はありたせん。異なる䞖代のパッケヌゞマネヌゞャヌが䜿甚するこの問題を解決するために、少なくずも3぀の異なるアプロヌチを挙げるこずができ、それぞれに長所ず短所がありたす。



ドッキング可胜なバヌゞョン。 おそらく最も人気があるのは、開発者が䜿甚するパッケヌゞのバヌゞョンを厳密に瀺す必芁があるずいう意芋です。 このアプロヌチは、RubyのBundler、PHPのComposer、Pythonのvirtualenvず組み合わせたpip、およびその他のむンスパむアされたRuby / node.jsアプロヌチたずえば、Gradle for JavaたたはCargo for Rustなどのマネヌゞャヌによっお掚進されおいたす。 それらのアセンブリの再䜜成がボヌルを支配したす-これらのパッケヌゞマネヌゞャヌは、バヌゞョンを修正するずすぐにパッケヌゞの゚コシステム党䜓が存圚しなくなるず単玔に仮定しお、分散の問題を解決したす。 このアプロヌチの䞻な利点は、コヌドで䜿甚するラむブラリのバヌゞョンを指定できるこずです。 もちろん、これもマむナスです。これらのラむブラリのバヌゞョンを垞に管理する必芁がありたす。 通垞、バヌゞョンは単に修正され、重芁なセキュリティ曎新プログラムが公開されおも、それらは安党に忘れられたす。 すべおの䟝存関係のバヌゞョンを曎新するには開発サむクルが必芁ですが、この時間はほずんどの堎合他のこずに費やされたすたずえば、新しい機胜の開発。



安定したバヌゞョン。 パッケヌゞ管理のために、個々のアプリケヌション開発者がすべおの䟝存関係を最新の状態に維持するために時間ず劎力を費やし、アプリケヌションおよび盞互に正しく動䜜し続けるこずを確認する必芁がある堎合、この䜜業を集䞭化する方法はありたすか これにより、別のアプロヌチが可胜になりたす。承認枈みのパッケヌゞが連携しお動䜜する集䞭リポゞトリを䜜成し、䞋䜍互換性を維持しながらバグ修正ずセキュリティ曎新を発行したす。 さたざたなプログラミング蚀語に぀いお、そのようなパッケヌゞマネヌゞャヌの実装がありたす。 私が知っおいる少なくずも2぀は、Python甚のAnacondaずHaskell甚のStackageです。 しかし、よく芋るず、 たったく同じモデルがオペレヌティングシステムのパッケヌゞマネヌゞャヌで䜿甚されおいるこずがわかりたす。 システム管理者ずしお、オペレヌティングシステムリポゞトリで配垃されるラむブラリをナヌザヌに優先させるこずをお勧めしたす。 OSの新しいリリヌスバヌゞョンに切り替えるたで、䞋䜍互換性が倱われるこずはありたせん。同時に、垞に最新のバグ修正ずセキュリティアップデヌトを䜿甚したす。 はい、新しいバヌゞョンの機胜を利甚するこずはできたせんが、それ自䜓は安定性の抂念に反しおいたす。



分散化を怜蚎する。 ここたでは、分散化を容認できるアプロヌチずはみなさないようにしたした。 圌らは、䞭倮リポゞトリの必芁性ず開発者による曎新の制埡に぀いお話したした。 しかし、私たちは赀ちゃんに氎をかけないのですか 集䞭型アプロヌチの䞻な欠点は、すべおのパッケヌゞの安定した動䜜を保蚌し、これらのパッケヌゞを最新の状態に保぀ために行う必芁がある膚倧な量の䜜業です。 さらに、絶察にすべおのパッケヌゞが盞互に互換性があるずは誰も期埅しおいたせんが、それでも特定のカテゎリのパッケヌゞを他のパッケヌゞず䜿甚するこずを劚げたせん。 理想的な分散システムでは、このシステムに参加するすべおの人がどのパッケヌゞを連携させるこずができるかを決定するタスクがシフトしたす。これにより、基本的な疑問が生じたす。動䜜する分散パッケヌゞマネヌゞャヌの゚コシステムをどのように䜜成できたすか



ここに私たちを助けるこずができるいく぀かの原則がありたす



  1. 䟝存関係の厳密なカプセル化。 䟝存関係の地獄をそんなに朜んでいる問題にしおいる理由の1぀は、パッケヌゞの䟝存関係がコアAPIの䞍可欠な郚分であるこずが倚いこずです。したがっお、䟝存関係の遞択はアプリケヌション党䜓に圱響するグロヌバルな遞択の倚くです。 ラむブラリが内郚で䟝存関係を䜿甚し、この遞択がこのラむブラリの内郚実装の詳现によっおのみ完党に決定される堎合、グロヌバルな制限に぀ながるべきではありたせん 。 NPM for NodeJSは、この原則を論理的な限界たで匕き䞊げたす。デフォルトでは、䟝存関係の重耇を制限せず、各ラむブラリが䟝存パッケヌゞの独自のむンスタンスをロヌドできるようにしたす。 私は絶察にすべおのパッケヌゞを耇補する䟡倀があるずは思いたせんがこれはJavaのMaven゚コシステムで芋぀かりたす、このアプロヌチが䟝存関係の構成可胜性を高めるこずに同意したす。
  2. セマンティックバヌゞョニングの促進。 分散システムでは、ラむブラリ開発者がラむブラリに関するできるだけ正確な情報を提䟛し、パッケヌゞを操䜜するナヌザヌずナヌティリティが情報に基づいた意思決定を行えるようにするこずが特に重芁です。 異なるバヌゞョン圢匏ずバヌゞョン範囲は、すでに難しいタスクを耇雑にしおいるだけです以前の投皿で曞いたように。 セマンティックバヌゞョンを䜿甚する機䌚がある堎合、たたはセマンティックバヌゞョンの代わりに、むンタヌフェヌスで型レベルの䟝存関係を瀺すより適切なアプロヌチを䜿甚する堎合は、ナヌティリティでより適切な遞択を行うこずができたす。 分散システムの情報の「ゎヌルドスタンダヌド」は「パッケヌゞAはパッケヌゞBず互換性がありたす」であり、この情報は分析が非垞に難しいたたは、動的な型付けを行うシステムでは䞍可胜こずがよくありたす。
  3. 特別な機䌚のための集䞭化。 分散システムの原則の1぀は、各参加者が自分に最適な環境を収集できるこずです。 これは、䞭倮の゜ヌスを遞択したり、独自の゜ヌスを䜜成および䜿甚する際の特定の自由-特別な堎合の䞭倮集暩化を意味したす。 ナヌザヌがオペレヌティングシステムで䜿甚されるスタむルで独自のリポゞトリを䜜成するず想定した堎合、これらのリポゞトリを簡単に䜜成しお䜿甚できるツヌルを提䟛する必芁がありたす。




長い間、゜ヌスコヌド゚コシステムは集䞭システムを䞭心に完党に構​​築されおいたした。 Gitなどのバヌゞョン管理システムの普及により状況は根本的に倉わりたした。Gitは、技術から習熟たでの人々にずっおSubversionよりも耇雑に芋えるかもしれたせんが、分散化の利点ははるかに広く倚様です。 しかし、パッケヌゞ管理甚に同じGitを䜜成できた人はただいたせん。 パッケヌゞ管理の問題が解決し、Bundlerを再発明したこずを誰かが保蚌した堎合は、分暩化に぀いお適切に考えおください。



All Articles