
パッケージ管理システム(パッケージかんりシステム、英: package management system)、またはパッケージマネージャ(英: package manager)とは、コンピュータプログラムのインストール、アップグレード、設定、アンインストールのプロセスを一貫した方法で自動化するシステムである。
パッケージ管理システムはパッケージを扱う。これは、ソフトウェアやデータをアーカイブ化したものである。パッケージには、ソフトウェアの名前、説明、バージョン番号、ベンダー、チェックサム(暗号学的ハッシュ関数が望ましい)、ソフトウェアが適切に実行されるために必要な依存関係のリストなどのメタデータが含まれる。インストール時に、メタデータはローカルパッケージデータベースに保存される。パッケージ管理システムは通常、ソフトウェアの不一致や前提条件の不足を防ぐために、依存関係とバージョン情報のデータベースを保持する。パッケージ管理システムは、ソフトウェアリポジトリ、バイナリリポジトリマネージャー、およびアプリケーションストアと密接に連携する。
パッケージ管理システムは、手動でのインストールやアップグレードの必要性を排除するように設計されている。通常、数百あるいは数万の個別のソフトウェアパッケージで構成されるオペレーティングシステムを持つ大企業にとって、これは特に便利である。
初期のパッケージ管理システムとして、IBM AIXのSMIT(およびそのバックエンドinstallp)があった。SMITは1989年にAIX 3.0で導入された[要出典]。
1994年頃の初期のパッケージ管理システムには自動で依存関係を解決する機能はなかったが、ソフトウェアのインストールやアンインストールのプロセスを大幅に簡素化することができた。
1995年頃、CPANに始まり、パッケージ管理システムはリポジトリからパッケージをダウンロードし、その依存関係を自動的に解決することで必要に応じてインストールすることができるようになり、ソフトウェアのインストールやアンインストール、更新がはるかに簡単になった。
ソフトウェアパッケージは、コンピュータプログラムとそのデプロイに必要なメタデータを含むアーカイブファイルである。コンピュータプログラムは、最初にコンパイルしてビルドする必要があるソースコードである場合がある。メタデータには、パッケージの説明、バージョン番号、依存関係(事前にインストールする必要がある他のパッケージ)などが含まれる。
パッケージ管理システムは、ユーザーのコマンドに応じてソフトウェアパッケージを検索、インストール、保守、またはアンインストールする。パッケージ管理システムの一般的な機能は次のとおりである。
静的ライブラリリンクではなく動的ライブラリリンクに依存するコンピュータシステムでは、パッケージやアプリケーション間で実行可能ライブラリを共有する。これらのシステムでは、異なるバージョンのライブラリを必要とするパッケージ間の競合関係により、俗に「依存関係地獄」と呼ばれる問題が発生する。Microsoft Windowsシステムでは、動的にリンクされたライブラリを使用する場合、これは「DLL地獄」とも呼ばれる。
最新のパッケージ管理システムでは、複数のバージョンのライブラリ(OPENSTEPのFrameworkシステムなど)や、あらゆる種類の依存関係(Portageのスロットなど)、さらには異なるコンパイラバージョンでコンパイルされたパッケージ(安定したABIが存在しないGlasgow Haskell Compilerによって構築された動的ライブラリなど)の並列インストールを許可することで、これらの問題をほぼ解決し、他のパッケージがリンクされたバージョンやインストールされたバージョンを指定できるようにしている。
システムアドミニストレータは、パッケージ管理ソフトウェア以外のツールを使用してソフトウェアをインストールおよび保守する場合がある。たとえば、ローカル管理者がパッケージ化されていないソースコードをダウンロードし、コンパイルしてインストールする場合がある。これにより、ローカルシステムの状態がパッケージ管理システムのデータベースの状態と同期されなくなる可能性がある。ローカル管理者は、一部の依存関係を手動で管理したり、変更をパッケージ管理システムと統合したりするなど、追加の対策を講じる必要がある。
ローカルでコンパイルされたパッケージがパッケージ管理システムに統合されていることを確認するためのツールがある。.debファイルと.rpmファイルベースのディストリビューションやSlackwareにはCheckInstallがあり、Gentoo LinuxなどのレシピベースのシステムやArch Linuxなどのハイブリッドシステムでは、最初にレシピを記述して、パッケージがローカルパッケージデータベースに適合するようにすることができる[要出典]。
ソフトウェアのアップグレードで特に厄介なのは、設定ファイルのアップグレードである。少なくともUnixシステムでは、パッケージ管理システムはファイルアーカイバの拡張機能として始まったため、通常は設定ファイルにルールを適用することはできず、設定ファイルを上書きするか保持するかしかできない。ただし、カーネル設定は例外である(カーネル設定が壊れていると、再起動後にコンピューターが使用できなくなる)。設定ファイルの形式が変わると問題が発生する可能性がある。たとえば、古い設定ファイルで無効にすべき新しいオプションが明示的に無効になっていない場合などである。Debianのdpkgなど、一部のパッケージ管理システムでは、インストール中に設定を行うことができる。他の状況では、たとえば多数のコンピュータへのヘッドレスインストールなど、パッケージをデフォルト設定でインストールしてからこの設定を上書きすることが望ましい場合がある。このような事前設定済みインストールも、dpkgによってサポートされている。
ユーザが自分のシステムにインストールを許可するソフトウェアの種類をより細かく制御できるようにするため(また、ディストリビューター側の法的または利便性上の理由により)、ソフトウェアは多くの場合、複数のソフトウェアリポジトリからダウンロードされる。
ユーザーがパッケージ管理システムを操作してアップグレードを行う場合、通常、実行するアクションのリスト(通常はアップグレードするパッケージのリストで、場合によっては古いバージョン番号と新しいバージョン番号も表示される)がユーザーに提示され、ユーザーがアップグレードを一括で受け入れるか、アップグレードするパッケージを個別に選択できるようになる。多くのパッケージ管理システムは、特定のパッケージをアップグレードしないように設定したり、ソフトウェアのパッケージ作成者が定義したように、以前のバージョンに重大な脆弱性や不安定性が見つかった場合にのみアップグレードするように設定したりできる。このプロセスは、バージョンピンニング(version pinning)と呼ばれることもある。
例として、以下のようなものがある。
exclude=openoffice* でこれをサポートする。IgnorePkg=openoffice を使用する(どちらの場合も openoffice のアップグレードを抑制する)。hold フラグを通じてこれを部分的にサポートする。hold フラグを拡張する(ユーザーはパッケージをブラックリストに登録することもできる)。hold フラグと forbid フラグがある。package.mask 設定ファイルを通じてこれをサポートする。より高度なパッケージ管理システムの中には「カスケードパッケージ削除(cascading package removal)」を提供するものもあり、対象とするパッケージに依存するすべてのパッケージと、対象パッケージのみが依存するすべてのパッケージが削除される。
コマンドはパッケージ管理システムごとに固有であるが、ほとんどのパッケージ管理システムが同様の機能を提供しているため、大部分は翻訳可能である。
| ツール | インストール | アップデート | アンインストール |
|---|---|---|---|
| APT | apt install <パッケージ名> |
apt upgrade [パッケージ名] |
apt remove <パッケージ名> |
| DNF / yum | dnf install <パッケージ名> |
dnf update [パッケージ名] |
dnf remove <パッケージ名> |
| Homebrew | brew install <パッケージ名> |
brew update |
brew remove <パッケージ名> |
| Nix | nix-env -i <パッケージ名> |
nix-env -u [パッケージ名] |
nix-env -e <パッケージ名> |
| Pacman | pacman -S <パッケージ名> |
pacman -Syu |
pacman -R <パッケージ名> |
| ZYpp | zypper install <パッケージ名> |
zypper update [パッケージ名] |
zypper remove <パッケージ名> |
Arch Linux wiki Pacman/Rosettaでは広範な概要が提供されている。
OSになんらかのソフトウェアを追加インストールする場合には、ソフトウェアに関係するファイル一式をまとめた「パッケージ」が利用される。パッケージの形式は複数あるが、利用される形式はOSによって限定されることが多い。
以下のパッケージには、インストールされるデータ・依存関係のみが含まれており、OSに搭載されているパッケージ管理システムを用いることでインストールできる。
ソフトウェアのアーカイブにインストール処理を行う仕組みを追加した形式。Mac OSやWindowsでよく使われ、Linuxディストリビューション向けのソフトウェアでも稀に利用される。依存関係の解決・インストールは、パッケージが独自に行う。
この他、ソフトウェアのソースコードがアーカイブされたパッケージも存在する。LinuxやFreeBSD等を含むUnix系OS等では、おもにtar.gz形式やtar.bz2形式などで配布されている。利用者は対象とするPC環境に合わせて構成やコンパイル等の作業を行った上でインストールする。多くの場合、Autotoolsによって作成された「configure」という名前のシェルスクリプトが付属しており、これを実行することでその環境における依存関係の確認や、コンパイルのためのMakefileの作成が行われる。ソースコードと、コンパイルのために必要なパッケージ(ビルド依存)は、パッケージ管理システムの機能を利用してダウンロードできる場合もある。

Gentoo Linuxでは原則として、ソフトウェアをソースコードからコンパイルしてインストールするようになっている。そのため、最適化された効率的で高速なシステムを構築可能である。しかし、コンパイルするために多くの時間と演算処理を要する。
インストールするソフトウェア自体は公式のものかミラーサイトからダウンロードするため、Gentoo Linuxにおけるパッケージの本体部分は、インストール手順が書かれたBashスクリプトである。
Mozilla FirefoxやLibreOfficeなどはコンパイルに時間がかかるため、バイナリパッケージも用意されている。Adobe FlashやGoogle Chromeなどのプロプライエタリソフトウェアも、公式に配布されているバイナリファイルをダウンロードしてインストールすることが可能なようになっている。
Gentoo Linuxのパッケージ管理システムは当初はPortageのみであったが、現在では規格として標準化されているため、承認されたパッケージ管理システムが複数あり、そのいずれかを使用することになる。
プログラミング言語においては、プログラムのソースコードを管理するために、パッケージ管理システムが使われる。その性質から多くがソースコード形式で管理・配布されているが、.NETやJavaなどはコンパイル済みで配布している。