パッケージマネージャー

Elementry
最終更新: タグ: Tooling

スマートフォンでアプリをインストールする場面を想像してほしい。ダウンロードリンクを探し回ったり、怪しいインストーラーを実行したり、「次へ → 次へ → 完了」ウィザードをクリックしたりはしない。App Store や Google Play を開いて「インストール」をタップするだけで、あとは全部自動でやってくれる。パッケージマネージャー(package manager)は、まったく同じことをターミナル上で行うツールだ。開発者の日常で最も重要なツールのひとつであり、一度使うと、どうやって今まで過ごしてきたのか不思議になるほどだ。

パッケージマネージャーとは?

パッケージマネージャーとは、ソフトウェアのインストール・更新・削除を代わりにやってくれるツールだ。プログラムを要求すると、次のことを行う:

  1. レジストリ(registry)またはリポジトリ(repository)と呼ばれる中央リストでそのソフトウェアを探す
  2. お使いの OS に合った正しいバージョンをダウンロードする
  3. そのプログラムが依存する他のソフトウェアも処理する
  4. 後で更新・削除できるよう、インストール済みの内容を記録しておく

パッケージ(package)とはひとまとめのことで、あるプログラムやライブラリをインストールするのに必要なすべてのものと、他に何が必要かという情報が一緒に梱包されたものだ。

パッケージマネージャーがない場合、ツールのセットアップは次のような手順になる:公式サイトを探し、OS に合ったダウンロードを判断し、インストーラーを実行し、プロンプトをクリックして進め、更新が出るたびに同じことを繰り返す。パッケージマネージャーがあれば、同じ結果がこうなる:

brew install git

コマンドひとつ。クリックなし。

パッケージマネージャーの二種類

開発キャリアを通じて、大きく異なる二種類のパッケージマネージャーを使うことになる:

  • システムパッケージマネージャーは、コンパイラ・コマンドラインツール・データベース・システムライブラリなど、汎用のソフトウェアを OS に直接インストールする。OS を理解し、システム全体の適切な場所にファイルを配置する。
  • 言語パッケージマネージャーは、特定のプログラミング言語向けのライブラリをインストールする。OS は関係なく、その言語独自のエコシステムに属するパッケージを管理する。

どちらも同じ原則で動く — レジストリ、ダウンロード、インストール済みの記録 — だが、目的が異なり、ほぼ常に別々のプログラムだ。

システムパッケージマネージャー

どのシステムパッケージマネージャーを使うかは、使っているオペレーティングシステムによって異なる。

apt — Ubuntu と Debian

Ubuntu と Debian(および Windows の WSL)では、システムパッケージマネージャーは apt だ。インストールする前に利用可能なパッケージのリストを更新するのが良い習慣だ:

sudo apt update           # 利用可能なパッケージの最新リストを取得する
sudo apt install git      # "git" というパッケージをインストールする

先頭の sudo は、そのコマンド一回だけ管理者権限を一時的に付与する。システム全体のソフトウェアを変更する際は必要になる。その変更はマシン上のすべてのユーザーに影響するためだ。

Homebrew — macOS

macOS では、コミュニティの標準はHomebrewで、ほぼ常に brew と呼ばれる。Homebrew はデフォルトで自分のホームディレクトリにインストールするため、ほとんどのコマンドに sudo は不要だ:

brew install git        # パッケージをインストールする

Homebrew は macOS に組み込まれていない — 一度インストールすれば、あとはすべてを管理してくれる。その一回限りのセットアップ手順は開発環境の準備で解説している。

pacman — Arch Linux

Arch Linux(および Manjaro などの派生)では、パッケージマネージャーは pacman だ。フラグの書き方が他と少し異なる:-S は「同期(sync)」を意味し、インストールの方法だ。新しいパッケージを追加する前に、既にインストールされているすべてのパッケージを更新するのが強い慣例だ:

sudo pacman -Syu          # インストール済みのものをすべて更新する
sudo pacman -S git        # パッケージをインストールする

dnf — Fedora と Red Hat

Fedora と Red Hat 系のシステムでは、古い yum の後継となる dnf を使う:

sudo dnf install git      # パッケージをインストールする

構文は apt と意図的に似せてあるため、Ubuntu を使ったことがあれば馴染みやすく感じるだろう。

並べて比較

OSパッケージマネージャーインストールコマンド
Ubuntu / Debian / WSLaptsudo apt install <名前>
macOSbrew(Homebrew)brew install <名前>
Arch Linuxpacmansudo pacman -S <名前>
Fedora / Red Hatdnfsudo dnf install <名前>

システムによって構文は異なるが、考え方はどこでも同じだ:コマンドひとつで、ソフトウェアがマシンに入る。

言語パッケージマネージャー

システムの設定が終わったら、プログラミング言語内で使うパッケージマネージャーにも出会うことになる。他の開発者が公開したライブラリを取り込めるので、すべてを自分で作る必要がなくなる。

npm — JavaScript と Node.js

npmNode Package Manager)は Node.js に付属し、JavaScript ライブラリを管理する。プロジェクトフォルダの package.json というファイルに、プロジェクトが依存するすべてのライブラリが列挙されている。npm install を実行するとそれらをすべてダウンロードする:

npm install                   # package.json に記載されたすべてをダウンロードする
npm install some-library      # 新しいライブラリをプロジェクトに追加する

pip — Python

pip は Python の標準パッケージマネージャーだ。PyPI(Python Package Index)と呼ばれるレジストリからライブラリをダウンロードする:

pip install requests          # "requests" ライブラリをインストールする

Python プロジェクトでは、必要なライブラリを列挙した requirements.txt というファイルを用意することが多く、誰でもコマンドひとつで同じ環境を再現できる。

cargo — Rust

Cargo は Rust のビルトインパッケージマネージャーかつビルドシステムで、あらゆる言語エコシステムの中でも最高水準の設計と広く見なされている。Rust プロジェクトを作ると、Cargo がすべてを担う:コードのコンパイル、テストの実行、そして Rust ではクレート(crate)と呼ばれるライブラリの管理 — これらは crates.io というレジストリからダウンロードされる。

cargo new my-project          # 標準的なレイアウトで新しい Rust プロジェクトを作成する
cargo build                   # プロジェクトをコンパイルする
cargo run                     # コンパイルしてすぐに実行する
cargo add serde               # "serde" クレートを依存関係として追加する

このカリキュラムが進むにつれて Cargo を常に使うことになる。今は、それがあって多くの重労働を代わりにやってくれる、とだけ知っておけば十分だ。

よく使う操作

すべてのパッケージマネージャーは同じ少数の基本操作をサポートしている。構文が少し違うだけだ。以下は参照用の表だ:

操作aptbrewpacmandnfcargo
パッケージをインストールapt install <名前>brew install <名前>pacman -S <名前>dnf install <名前>cargo add <クレート>
インストール済みを更新apt upgradebrew upgradepacman -Syudnf upgradecargo update
パッケージを削除apt remove <名前>brew uninstall <名前>pacman -R <名前>dnf remove <名前>Cargo.toml を編集)
パッケージを検索apt search <語句>brew search <語句>pacman -Ss <語句>dnf search <語句>cargo search <クレート>

すべての列を今すぐ暗記する必要はない。必要なときの参照用として使ってほしい。

まとめ

  • パッケージマネージャーは、ソフトウェアのインストール・更新・削除を自動で行い、手動ダウンロードやインストーラーから解放してくれる。
  • パッケージはソフトウェアのひとまとめ。レジストリは、パッケージマネージャーが参照する利用可能なパッケージの中央リストだ。
  • 二種類ある:システムパッケージマネージャーは OS にソフトウェアをインストールし、言語パッケージマネージャーは特定の言語エコシステム内のライブラリをインストールする。
  • OS 別システムパッケージマネージャー:Ubuntu/Debian/WSL は apt、macOS は brew(Homebrew)、Arch Linux は pacman、Fedora は dnf
  • 言語パッケージマネージャー:JavaScript は npm、Python は pip、Rust は cargo
  • インストール・更新・削除・検索という基本操作はどのパッケージマネージャーもサポートしている。違うのは正確なコマンドだけだ。

次のステップ

パッケージマネージャーとは何かを把握したら、開発環境の準備で実際に使ってみよう — シェル、パッケージマネージャー、その他コードを書く前に必要なツールを順を追ってセットアップする。