
パッケージマネージャーまたはパッケージ管理システムは、ホストシステムへのソフトウェアのインストール、アップグレード、構成、削除を一貫した方法でサポートするソフトウェアです。 [ 1 ]
パッケージマネージャーは、パッケージ、ソフトウェアのディストリビューション、およびアーカイブファイル内のデータを処理します。パッケージには、ソフトウェアの名前、用途の説明、バージョン番号、ベンダー、チェックサム(通常は暗号ハッシュ関数)、ソフトウェアが正常に動作するために必要な依存関係のリストなどのメタデータが含まれています。インストール時に、メタデータはローカルパッケージデータベースに保存されます。パッケージマネージャーは通常、ソフトウェアの依存関係とバージョン情報のデータベースを管理し、ソフトウェアの不一致や前提条件の不足を防止します。パッケージマネージャーは、ソフトウェアリポジトリ、バイナリリポジトリマネージャー、およびアプリストアと緊密に連携します。
パッケージマネージャは、手動によるインストールやアップデートの必要性を排除するように設計されています。これは、オペレーティングシステム(OS)が数百、あるいは数万もの個別のパッケージで構成されている大規模企業にとって特に有用です。[ 2 ]
初期のパッケージマネージャはIBM AIXのSMIT(およびそのバックエンドインストール)でした。SMITは1989年にAIX 3.0で導入されました。dpkgのようなパッケージマネージャは1994年にはすでに存在していました。[ 3 ] 1994年頃の初期のパッケージマネージャには依存関係の自動解決機能はありませんでしたが[ 4 ]、実行中のシステムへのソフトウェアの追加と削除のプロセスを簡素化することは既に可能でした。[ 5 ]
1995年頃、CPANに始まり、パッケージマネージャはパッケージリポジトリのダウンロード、依存関係の解決、必要に応じてインストールを処理するようになり、ソフトウェアのインストール、アンインストール、アップデートが容易になりました。[ 6 ]

ソフトウェアパッケージとは、コンピュータプログラムとその展開に必要なメタデータを含むアーカイブファイルです。プログラムはソースコードである場合があり、まずコンパイルとビルドが必要です。[ 7 ]パッケージのメタデータには、ソフトウェアの説明、バージョン番号、依存関係が含まれます。
パッケージマネージャーは、ユーザーの指示に従ってパッケージを検索、インストール、保守、またはアンインストールする役割を担います。パッケージ管理システムの典型的な機能には、以下のものがあります。
静的ライブラリリンクではなく動的ライブラリリンクを利用するコンピュータシステムでは、パッケージやアプリケーション間でマシン命令の実行可能ライブラリを共有します。このようなシステムでは、異なるバージョンのライブラリを必要とする異なるパッケージ間の競合関係により、 「依存関係地獄」と呼ばれる状況が発生します。Microsoft Windowsシステムでは、動的リンクライブラリを使用する場合、これは「DLL地獄」とも呼ばれます。 [ 8 ]
現代のパッケージ マネージャーは、複数のライブラリ バージョン ( OPENSTEPのフレームワークシステムなど)、あらゆる種類の依存関係 ( Gentoo Portageのスロットなど)、さらには異なるコンパイラ バージョンでコンパイルされたパッケージ (安定したABIが存在しないGlasgow Haskell コンパイラによってビルドされた動的ライブラリなど) の並行インストールを許可することで、これらの問題をほぼ解決しています。これにより、他のパッケージがリンクまたはインストールされるバージョンを指定できるようになります。
システム管理者は、パッケージマネージャー以外のツールを使用してソフトウェアのインストールとメンテナンスを行う場合があります。例えば、ローカル管理者がパッケージ化されていないソースコードをダウンロードし、コンパイルしてインストールするなどです。これにより、ローカルシステムとパッケージマネージャーのデータベースの同期が失われる可能性があります。ローカル管理者は、依存関係の一部を手動で管理したり、変更をパッケージマネージャーに統合したりするなど、追加の対策を講じる必要があります。
ローカルでコンパイルされたパッケージがパッケージ管理に統合されていることを確認するツールがあります。.debファイルや.rpmファイルベースのオペレーティングシステムやSlackware LinuxではCheckInstallが、レシピベースのシステム(Gentoo Linuxなど)やハイブリッドシステム( Arch Linuxなど)では、まずレシピを記述することで、パッケージがローカルパッケージデータベースに適合することを確認できます。
設定ファイルのアップグレードは特に厄介な場合があります。パッケージ マネージャーは、少なくともUnix システムでは、ファイル アーカイバの拡張機能として始まったため、通常は設定ファイルにルールを適用するのではなく、上書きまたは保持することしかできません。これには例外があり、通常カーネル設定に当てはまります (カーネル設定が壊れていると、再起動後にコンピュータが使用できなくなります)。設定ファイルの形式が変わると、問題が発生する可能性があります。たとえば、古いファイルで、無効にすべき新しいオプションが明示的に無効にされていない場合などです。Debian の dpkg など、一部のパッケージ マネージャーでは、インストール中に設定を行うことができます。他の状況では、パッケージはデフォルトの設定でインストールされ、その後、たとえば多数のコンピュータへの ヘッドレスインストールなどで上書きされます。このような事前設定済みのインストールも、dpkg ではサポートされています。
ユーザーがシステムにインストールを許可するソフトウェアをより細かく制御できるようにするため、また場合によっては配布者側の法的または利便性上の理由により、パッケージはソフトウェアリポジトリからダウンロードされることがよくあります。[ 9 ]
ユーザーがパッケージ管理ソフトウェアを使用してパッケージをアップグレードする場合、実行するアクション (通常はアップグレードするパッケージの一覧と、場合によっては新旧のバージョン番号) が提示され、一括でアップグレードを受け入れるか、アップグレードするパッケージを個別に選択できるようにするのが一般的です。多くのパッケージ マネージャーは、特定のパッケージをアップグレードしないように設定したり、ソフトウェアのパッケージ作成者が定義したように、以前のバージョンに重大な脆弱性や不安定性が見つかった場合にのみアップグレードするように設定したりできます。このプロセスは、アップグレードの抑制、またはバージョン ピンニングと呼ばれます。たとえば、OpenOfficeプログラム のアップグレードを防止するには、次の手順を実行します。
exclude=openoffice*IgnorePkg= openoffice[ 11 ](どちらの場合もOpenOfficeのアップグレードを抑制するため)より高度なパッケージ管理機能の中には、カスケードパッケージ削除[ 11 ]を提供するものがあり、これにより対象パッケージに依存するすべてのパッケージと、対象パッケージのみが依存するすべてのパッケージも削除されます。
コマンドはパッケージマネージャーごとに異なりますが、ほとんどのパッケージマネージャーが同様の機能を提供しているため、ある程度は翻訳可能です。Arch Linux wikiでは、コマンドに関する詳細な概要を提供しています。[ 14 ]
| アクション | 自家製 | アプト | パックマン | dnf (ヤム) | ポーテージ | ジッパー[ 15 ] | ニックス | XBPS [ 16 ] | swupd [ 17 ] | ウィンゲット |
|---|---|---|---|---|---|---|---|---|---|---|
| パッケージをインストールする | brewinstall${PKG} | aptinstall${PKG} | pacman-S${PKG} | dnfinstall${PKG} | emerge${PKG} | zypperin${PKG} | nix-env-i${PKG} | xbps-install${PKG} | swupdbundle-add${PKG} | winget install %PKG% |
| パッケージを削除 | brewuninstall${PKG} | aptremove${PKG} | pacman-R${PKG} | dnfremove--nodeps${PKG} | emerge-C${PKG}またはemerge--unmerge${PKG} | zypperrm-RU${PKG} | nix-env-e${PKG} | xbps-remove${PKG} | swupdbundle-remove${PKG} | winget uninstall %PKG% |
| ソフトウェアデータベースを更新する | brewupdate | aptupdate | pacman-Sy | dnfcheck-update | emerge--sync | zypperref | nix-channel--upgrade | xbps-install-S | swupdupdate--downloadまたはswupdupdate--update-search-file-index | winget upgrade |
| 更新可能なパッケージを表示 | brewoutdated | aptlist--upgradable | pacman-Qu | dnfcheck-update | emerge-avtuDN--with-bdeps=y@worldまたは(は の省略形であり、は の省略形です。) emerge-u--pretend@world-D--deep-u--update | zypperlu | nix-channel --upgrade && \ nix-env -u && \ nix-collect-garbage | ./xbps-srcupdate-check${PKG}(void-packages リポジトリが必要です) | swupdupdate-sまたはswupdcheck-update | winget upgrade |
| すべて更新 | brewupgrade | aptupgrade | pacman-Syu | dnfupdate | emerge-u-D--with-bdeps=y@world | zypperup | nix-env-u&&nix-collect-garbage | xbps-install-Su | swupdupdate | winget upgrade --all |
| 孤立ファイルと設定を削除する | brewautoremove&&brewcleanup | aptautoremove | pacman-Rsn$(pacman-Qdtq) | 該当なし | emerge--depclean | zypperrm-u | nix-collect-garbage-d | xbps-remove-of | swupdバンドル削除--orphans && \ swupdクリーン--all | 該当なし |
| 孤児を表示 | brewautoremove--dry-run | 該当なし | pacman-Qdt | package-cleanup-q--leaves--exclude-bin(-qは の省略形です--quiet。) | emerge-caDまたはemerge--depclean--pretend | zypperpa--orphaned--unneeded | 該当なし | xbps-remove-o | swupdbundle-list--orphans | 該当なし |
| パッケージ(および孤立パッケージ)を削除する | brew uninstall ${ PKG } && brew autoremove | aptautoremove${PKG} | pacman-Rs${PKG} | dnfremove${PKG} | emerge-c${PKG}またはemerge--depclean${PKG} | zypperrm-u--force-resolution${PKG} | nix-env-e${PKG}&&nix-env-u | xbps-remove-R${PKG} | swupdバンドル削除${ PKG } && \ swupdバンドル削除--orphans | winget uninstall %PKG% |
バイナリパッケージを中心とするLinuxディストリビューションは、ソフトウェアの管理と保守の主な手段としてパッケージ管理システムに大きく依存しています。Android (Linuxベース)やiOS(Unixベース)などのモバイルオペレーティングシステムは、それぞれのベンダーのアプリストアにほぼ全面的に依存しており、専用のパッケージ管理システムを使用しています。
pacmanArchベースのディストリビューション用のCLIユーティリティパッケージマネージャーはインストールマネージャーと呼ばれることが多く、パッケージマネージャーとインストーラーが混同されることがあります。違いは以下のとおりです。
| 基準 | パッケージマネージャー | インストーラ |
|---|---|---|
| 同梱物 | 通常、オペレーティングシステム | 各コンピュータプログラム |
| インストール情報の場所 | 1つの中央インストールデータベース | それは完全にインストーラの裁量次第です。アプリのフォルダ内のファイル、あるいはオペレーティングシステムのファイルやフォルダの中にある可能性があります。せいぜい、インストール情報を公開することなく、アンインストーラのリストに自身を登録する程度でしょう。 |
| メンテナンスの範囲 | システム上のすべてのパッケージ | バンドルされた製品のみ |
| 開発者 | パッケージマネージャベンダー1社 | 複数のインストーラベンダー |
| パッケージ形式 | いくつかのよく知られたフォーマット | アプリの数だけフォーマットが存在する可能性がある |
| パッケージ形式の互換性 | パッケージマネージャーがサポートしている限り使用できます。パッケージマネージャーの新しいバージョンがサポートを継続するか、ユーザーがパッケージマネージャーをアップグレードしない限り、この機能は利用できません。 | インストーラーは、アーカイブ形式を使用している場合、常にその形式と互換性があります。ただし、他のコンピュータプログラムと同様に、インストーラーもソフトウェアの劣化の影響を受ける可能性があります。 |
ほとんどのソフトウェア構成管理システムでは、ソフトウェアのビルドとデプロイを別々の独立したステップとして扱います。ビルド自動化ユーティリティは通常、コンピューター上に既に存在する人間が読める形式のソースコードファイルを取得し、それらを同じコンピューターまたはリモートコンピューター上で実行可能パッケージに変換するプロセスを自動化します。その後、通常は別のコンピューターで実行されるパッケージマネージャーが、ビルド済みの実行可能ファイルをダウンロードしてインストールします。
ただし、どちらの種類のツールにも多くの共通点があります。
make install。MaakやAAPなどのツールはビルドとデプロイメントの両方を処理するように設計されており、ビルド自動化ユーティリティ、パッケージマネージャー、またはその両方として使用できます。[ 18 ]
アプリストアは、アプリケーションレベルのパッケージマネージャー(すべてのレベルのプログラムをインストールする機能はない[ 19 ] [ 20 ])とも考えられます。従来のパッケージマネージャーとは異なり、アプリストアはソフトウェア開発ではなくソフトウェア自体に対して支払いができるように設計されており、依存関係や依存関係の解決のないモノリシックなパッケージのみを提供する場合があります。[ 21 ] [ 20 ]アプリストアは通常、パワーや出現よりも使いやすさに重点を置いているため、管理機能が制限されており、商用オペレーティングシステムやスマートデバイスで一般的です。
パッケージマネージャーも、人間がレビューしたコードしか持っていないことがほとんどです。Google PlayやAppleのApp Storeなど、多くのアプリストアでは、主に自動化ツールのみを使用してアプリをスクリーニングしています。マルウェアは、アプリがテストされていることを検知し、悪意のある活動を遅らせることで、これらのテストを通過できます。[ 22 ] [ 23 ] [ 24 ]例外もあります。たとえば、 npmパッケージデータベースは、コードの公開後のレビューに完全に依存しています。 [ 25 ] [ 26 ]一方、Debianパッケージデータベースでは、パッケージがメインデータベースに追加される前に、人間による徹底的なレビュープロセスがあります。XZ Utilsバックドアは、バックドアを挿入するために何年もの信頼構築を利用しましたが、それでもテストデータベースで発見されました。
バイナリリポジトリマネージャーとも呼ばれるこのソフトウェアツールは、ソフトウェア開発プロセスで使用および生成されるバイナリファイル、成果物、パッケージのダウンロードと保存を最適化するために設計されています。[ 27 ]これらのパッケージマネージャーは、企業があらゆる種類のパッケージを扱う方法を標準化することを目的としています。ユーザーは、あらゆる種類の成果物にセキュリティとコンプライアンスのメトリクスを適用できます。ユニバーサルパッケージマネージャーは、 DevOpsツールチェーンの中核を担うと言われています。[ 28 ]
各パッケージマネージャーは、リポジトリ内のパッケージのフォーマットとメタデータに依存しています。つまり、パッケージマネージャーは、依存関係などの適切なメタデータとともに、ファイルグループをバンドルする必要があります。多くの場合、コアとなるユーティリティセットがこれらのパッケージの基本的なインストールを管理し、複数のパッケージマネージャーがこれらのユーティリティを使用して追加機能を提供します。
例えば、yumはバックエンドとしてrpmに依存しています。yumは、システムネットワークの保守のためのシンプルな設定機能などを追加することで、rpmの機能を拡張します。別の例として、Synaptic Package ManagerはAdvanced Packaging Tool (apt)ライブラリを使用してグラフィカルユーザーインターフェースを提供していますが、aptライブラリはコア機能として dpkgに依存しています。
Alien は、さまざまなLinux パッケージ形式を変換するプログラムであり、Linux Standard Base (LSB) 準拠の.rpmパッケージ、.deb、Stampede (.slp)、Solaris (.pkg)、およびSlackware ( .tgz、.txz、.tbz、.tlz) パッケージ間の変換をサポートしています。
モバイルオペレーティングシステムの場合、Google PlayはAndroidアプリケーションパッケージ(APK)形式を使用し、 Microsoft StoreはAPPX形式とXAP形式を使用します。Google PlayとMicrosoft Storeはどちらも、独自のパッケージマネージャーを備えています。
フリー オープンソース ソフトウェア(FOSS)の性質上、類似した互換性のあるライセンスのパッケージが、多くのオペレーティング システムで利用できます。これらのパッケージは、構成可能なパッケージ システムを使用して組み合わせて配布することができ、さまざまなソフトウェアの組み合わせを処理し、バージョン固有の依存関係と競合を管理できます。一部の FOSS パッケージ マネージャーは、それ自体が FOSS としてリリースされています。Mac OS X や Windows などのプロプライエタリ オペレーティング システムのパッケージ管理と、Linux などのフリー オープンソース ソフトウェアのパッケージ管理の一般的な違いは、フリー オープンソース ソフトウェア システムでは、同じメカニズムを使用してサードパーティ製のパッケージもインストールおよびアップグレードできるのに対し、Mac OS X と Windows のパッケージ マネージャーは、それぞれ Apple と Microsoft が提供するソフトウェアのみをアップグレードすることです (Windows の一部のサードパーティ製ドライバーを除く)。サードパーティ製ソフトウェアを継続的にアップグレードする機能は通常、対応するリポジトリのURLをパッケージ管理の構成ファイルに追加することによって追加されます。
システムレベルのアプリケーション マネージャーの他に、機能が制限されたオペレーティング システム用や、開発者が最新のライブラリを必要とするプログラミング言語用のアドオン パッケージ マネージャーもあります。
システムレベルのパッケージマネージャとは異なり、アプリケーションレベルのパッケージマネージャはソフトウェアシステムのごく一部に焦点を当てています。通常、c:\cygwinや/opt/swなど、システムレベルのマネージャによって管理されていないディレクトリツリー内に存在します。[ 29 ]これは、プログラミングライブラリを扱うマネージャには当てはまらない場合があり、両方のマネージャがファイルの所有権を主張し、アップグレードが失敗するなど、競合が発生する可能性があります。
イアン・マードックは、パッケージ管理は「 Linuxが業界にもたらした最大の進歩」であり、オペレーティングシステムとアプリケーションの境界を曖昧にし、「新しいイノベーションを市場に投入し、OSを進化させることが容易になる」とコメントした。[ 30 ]
パッケージマネージャー開発者向けのカンファレンス「PackagingCon」もあります。これは、パッケージ管理へのさまざまなアプローチを理解することを目的として、2021年に設立されました。[ 31 ]