定義
パッケージマネージャーは、ソフトウェアを作ったりパソコンを使ったりするときに必要な外部のプログラムの部品(ライブラリやツール)を、自動でダウンロードしてインストールし、最新バージョンに更新し、不要になったら安全に削除してくれる専用の管理ツールです。
ミールキットの箱のように、必要な材料をまとめて揃えてくれます
料理をするとき、必要な調味料や野菜を探して市場やスーパーを何軒もはしごしていたら、作り始める前に疲れてしまいます。そのかわり、必要な材料とレシピがきれいにまとまったミールキットを注文すれば、料理はずっと楽で早くなりますよね。
ソフトウェア作りもこれによく似ています。開発者は、画面にカレンダーを表示したり暗号化を処理したりする機能を、毎回ゼロから自分でコーディングしたりしません。世界中のほかの開発者があらかじめ頑丈に作って公開しているコードのまとまり、つまりライブラリを持ってきて組み立てます。
昔は、こうしたコードのファイルを掲示板やウェブサイトで一つずつ探してダウンロードし、プロジェクトのフォルダに自分で移さなければなりませんでした。ところがパッケージマネージャーが登場したおかげで、いまはコマンドを1行入力するだけで、必要なソフトウェアの部品をあっという間に自分のパソコンに取り込んでセットアップできます。
複雑にからまった「依存関係」を自動でほどいてくれます
ソフトウェアの部品は、単独で動くよりも、ほかの部品に頼って動くことが多いものです。たとえば、自分が選んだカレンダーの部品がきちんと動くには、日付を計算する別の部品が先に入っている必要があります。これを開発の用語で「依存関係(たがいに頼り合って動く関係)」と呼びます。
もし人間が手作業でこれをやったら、大変なことになります。A の部品のために B を入れ、B のために C を入れ、そのうちバージョン番号が一つでも食い違うと、プログラムが動かなくなりやすいからです。開発者たちはこれを「依存関係地獄(dependency hell)」と呼んでいます。
パッケージマネージャーは、この複雑な家系図を自動でするするとほどいてくれます。メインの部品を一つ指定すれば、その部品が動くのに必要な数十個もの隠れた下位の部品について、たがいにぶつからないバージョンの組み合わせを計算して、まとめてインストールしてくれます。そんな組み合わせがなければ、衝突していると知らせてくれます。
もう少し正確に言うと:組み立て説明書とオンライン倉庫
もう少し正確に言うと、パッケージマネージャーは単なるダウンローダーではなく、大きな流通システムです。世界中の開発者が作ったパッケージを集めておく「レジストリ(中央リポジトリ)」というオンラインの倉庫と、必要なたびにやり取りします。
また、npm のように多くのパッケージマネージャーは、プロジェクトがどの部品のどのバージョンを使っているかをきちんと記録した「ロックファイル(lockfile)」を作ります。プログラムは、ごく小さな部品のバージョンが変わっただけでも、思いがけないバグが出ることがあるからです。この仕組みのおかげで、ほかのチームメンバーのパソコンや公開用のサーバーでも、まったく同じ部品バージョンでできた開発環境を再現できます。
Python の pip、JavaScript の npm、Linux の apt、Mac の Homebrew のように、環境ごとにそれぞれ専用のパッケージマネージャーがあり、現代のソフトウェア開発の大きな柱になっています。
よくある誤解
パッケージマネージャーは、完成した普通のパソコン用プログラムをインストールするためだけの道具だ。
普通のプログラムをインストールするパッケージマネージャーもありますが、プログラミング言語のエコシステムの中で特定の機能を担う小さなコードの断片やライブラリを、プロジェクト単位で管理する用途にも広く使われています。
日常で出会う場面
JavaScript の開発者が「npm install react」というコマンド1行で、画面づくり用のツールをプロジェクトに取り込みます。
Python のデータ分析者が「pip install pandas」と入力して、データ整理のツールと、それに必要な計算用の部品をまとめてインストールします。
つまり ひとことで
ソフトウェアの部品をオンライン倉庫から探し、依存関係の衝突なしに自動でインストール・管理してくれる道具です。