【初心者向け🔰】パッケージマネージャとは

## 概要
プログラミング初心者向けに、「パッケージマネージャ（パッケージ管理システム）」についてのまとめ。
また、「ライブラリ」「パッケージ」「モジュール」などの違いについても、ごく軽く触れる。

ざっくりと説明するため、厳密には語弊がある表現をするかもしれません。

## パッケージマネージャとは
「パッケージマネージャ（パッケージ管理システム）」とは、簡単に言うと、

- インストールできるプログラムを検索する
- プログラムを簡単にインストールする/アンインストールする
- 「今、PCに何インストールしてたっけ？」を一覧ですぐに確認できる

などの、プログラムを簡単・便利に管理するツールのこと。
これらの **管理** ＝マネジメントを、「 **パッケージ** （または、ライブラリ）」という単位で行うので、 **パッケージマネージャ** と呼ぶ。
※「パッケージ」という言葉の説明は、後述する

「ソフトのインストール」と聞いたら、通常はWebやアプリストアで検索をして導入するイメージだが、パッケージマネージャを使う場合は、ターミナル等を使って、コマンド操作を利用する。
![パッケージマネージャとは_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/f243e1c9-fcc6-2591-0a59-1d5289c3ff16.png)

世の中には色んなパッケージマネージャが存在し、自分が開発で使う言語やOSに合わせて、専用のものを利用する。
![パッケージマネージャとは_02_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/d646ae50-4f09-3588-aa10-ba7877741b5d.png)

### インストール/アンインストールが簡単な理由

通常インストールする場合、
**Webサイトからインストーラをダウンロード👉ダブルクリックしてインストール**
という手順で、PCのどこかにソフトが導入されるが、インストールするソフトによって手順ややり方が変わることもあり、インストール場所もソフトでバラバラになる可能性がある。
しかし、パッケージマネージャなら、これがコマンド一行を叩くだけで完了する（場合によっては、更に PATH を通す作業が発生）し、格納場所も１箇所に集約される。

また、アンインストール時も、ソフトによってアンインストール方法が違うが、パッケージマネージャなら共通コマンドで名前を変えるだけで一発で削除できる。

### パッケージ
パッケージは、色んな機能や処理がまとまったプログラムのかたまり。
おもちゃやお菓子が袋に詰まったものを「パッケージ商品」と言うように、処理がたくさん詰まって１つの便利な商品となったプログラムみたいなイメージ。

こういったツールで管理される大体のパッケージには、実際に利用するプログラムの他に、「パッケージ名」「開発者名（個人・団体）」「依存関係」などの情報も一緒に含まれている（そういう概要情報がまとまったファイルに記載されている）。

他にも、「ライブラリ」「モジュール」という横文字が出てくることがあるが、要するに、 **プログラムのかたまりに対する呼び方** に種類があると思えば、今は一旦OK。具体的には下記のようなイメージ
![パッケージとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/0353ba01-e032-76be-a758-2ff2bfd531f2.png)

ライブラリ > パッケージ > モジュール という関係になっている。
各言語や技術における、これらの言葉の定義は、また別の機会に触れていく。

### 「依存関係」って何？
あるパッケージ（or ライブラリ）が動作するために必要な、中で動く他の細かいソフトウェアのこと。
つまり、パッケージの中のプログラムは 100% オリジナルではないことが多く、既存のプログラムや技術を色々と組み合わせながら動いているケースがほとんど。

それら他のソフトウェアも一緒にダウンロードしたり、バージョンを勝手に更新してくれたりして、パッケージ全体として正常に動くように解決することを **「依存関係の解決」** と言う。
「依存関係の解決」をしてくれる所も、パッケージマネージャの大きな特徴の１つ。

### 大体は Webサイトがあって、パッケージ検索する画面が用意されている
パッケージマネージャ自体は、コンピュータ上でターミナルなどを使ってコマンド打って使用するのがほとんどだが、多くはWebサイトも用意されていて、主にパッケージ検索をする画面などが用意されている。

パッケージ検索は、コマンドでも可能だが、Webの方が見やすいので使われることも多い。

## 開発で使われる代表的なパッケージマネージャ

|パッケージマネージャ|言語/OS|概要|
|:---:|:---:|:---|
|Homebrew|macOS<br>Linux|コンピピュータにインストールするソフトを管理するパッケージマネージャ|
|npm|JavaScript|「Node.js」というソフトをインストールすると同時に導入されるパッケージマネージャ<br>他に yarn なども人気|
|pip|Python|Python の標準的なパッケージマネージャ<br>Condaと違いマシン単位で依存関係を管理する|
|Conda|Python|科学計算のための Python プラットフォーム「Anaconda」の一部として提供されている Python パッケージマネージャ|
|Composer|PHP|PHP の標準的なパッケージマネージャ|
|PEAR|PHP|以前まで PHP でよく利用されていたライブラリ提供サービス。PHP 7.4 から PEAR はデフォルトツールではなくなり、現在は Composer の方が標準的な立場になっている|
|GoMod|Go|Go言語用のパッケージマネージャで、Goのプログラムとライブラリ（mod）の配布用標準フォーマットを提供|
|RubyGems|Ruby|Ruby 言語用のパッケージマネージャであり、Ruby のプログラムとライブラリ（gem）の配布用標準フォーマットを提供|
|Bundler|Ruby|こちらも Ruby パッケージマネージャだが、RubyGems では解決できない gem 同士の依存関係を解決したりするので、こっちがよく使われる。<br>Bundler自身は RubyGems で導入し、使用するには「Gemfile」（＋Gemfile.lock）というファイルを用意する必要がある|
|Pub|Dart|Dart言語製ソフトウェアプロジェクトの CUI のビルドツールであり、パッケージマネージャの機能をも持つ<br>Pub の依存ライブラリのダウンロード先は Pub.dev|
|Cargo|Rust|Rust 言語製ソフトウェアプロジェクト（crate）のCUIのビルドツールであり、パッケージマネージャの機能をも持つ<br>Cargo の依存ライブラリのダウンロード先は crates.io|
|CocoaPods|Objective-C<br>Swift|Objective-Cランタイムで動作するパッケージマネージャ<br>RubyGems に影響を受けている|