ソフトウェアリポジトリ (英: software repository)は、ソフトウェアパッケージの格納場所のことで、多くの場合、目次とメタデータが保存される。単にリポジトリと呼ばれる場合もある。ソフトウェアリポジトリは通常、ソース管理またはリポジトリマネージャによって管理される。パッケージマネージャを使用すると、リポジトリ（"パッケージ" と呼ばれる）を自動でインストール、更新できる。

 概要 
多くのソフトウェア発行者などの組織は、無料またはサブスクリプション料金でインターネット上にコンテンツリポジトリ用のサーバーを持っている。リポジトリは、 Perlプログラミング言語のCPANなどの特定のプログラム専用、オペレーティングシステム全体専用のものがある。リポジトリの運営者は通常、リポジトリからソフトウェアパッケージを検索、インストール、その他の方法で操作することを目的としたパッケージ管理システムと呼ばれるツールを提供している。たとえば、多くのLinuxディストリビューションは、 たとえばDebianベースのディストリビューションで一般的に見られるAdvanced Packaging Tool （APT）、またはRedHatベースのディストリビューションで見られるyumといったパッケージ管理システムを使用している。また、Arch Linuxやequo、 Sabayon Linuxで使われるpacmanのような独立したパッケージ管理システムもある。

ソフトウェアリポジトリには便利なパッケージが含まれており、主要なリポジトリにはマルウェア防止機能が備わっている。信頼できるベンダーのデジタル署名されたリポジトリを使用するようにコンピュータが構成されており、適切なアクセス許可システムと組み合わされている場合、マルウェアの脅威が大幅に軽減される。そのため、多くのソフトウェアリポジトリには、ウイルス対策ソフトウェアなどのマルウェア対策ソフトウェアが不要である。 

ほとんどの主要なLinuxディストリビューションには、メインリポジトリを反映した多くのリポジトリが世界中にある。

エンタープライズ環境では、ソフトウェアリポジトリは通常、アーティファクトを格納するため、またはセキュリティ制限のためにアクセスできない可能性のある外部リポジトリをミラーリングするために使用される。このようなリポジトリは、アクセス制御、バージョン管理、アップロードされたソフトウェアのセキュリティチェック、クラスタ機能などの追加機能を提供し、通常、企業のすべてのニーズに対応するために、1つのパッケージでさまざまな形式をサポートして、信頼できる唯一の情報源を提供する。ArtifactoryとNexusなどが人気がある。

クライアント側では、パッケージ管理システムがリポジトリからのインストールとリポジトリの更新を支援する。

サーバー側では、ソフトウェアリポジトリは通常、ソース管理またはリポジトリマネージャによって管理される。一部のリポジトリマネージャでは、他のリポジトリの場所を1つのURLに集約し、キャッシュプロキシを提供する。継続的ビルドを行う場合、多くのアーティファクトが生成され、多くの場合一元的に保存されるため、リリースされていないアーティファクトを自動的に削除することが重要である。

 パッケージ管理システムとパッケージ開発プロセス 
パッケージ管理システムは、パッケージ開発プロセスとは異なる。

パッケージ管理システムの一般的な使用法は、さまざまなソースからのコードをコヒーレントなスタンドアロンオペレーティングユニットに統合しやすくすることである。したがって、パッケージ管理システムを使用して、 Linuxディストリビューション、場合によっては特定の制限されたアプリケーションに合わせたディストリビューションを作成することができる。

対照的に、パッケージ開発プロセスは、共通のテーマを持つ関数またはルーチンのコレクションのコードとドキュメントの共同開発を管理するために使用され、それによって、通常は完全ではなく、それ自体では使用できないソフトウェア関数のパッケージを生成する。優れたパッケージ開発プロセスは、ユーザーが優れたドキュメントとコーディング手法に準拠し、ある程度の単体テストを統合するのに役立つ。

 リポジトリの例 
次の表に、提供されたソフトウェアのリポジトリを備えたいくつかの言語を示します。 「自動チェック」列では、実行される定期的なチェックについて説明します。

コアコードのバージョンが異なり、使用する可能性のある他の提供パッケージを使用して、複数のオペレーティングシステムでソフトウェアをテストできる人はほとんどいません。 Rの場合、 Comprehensive R Archive Network（CRAN）は定期的にテストを実行します。これがどのように価値があるかを確認するために、SallyがパッケージAを提供するとします。Sallyは現在のバージョンのソフトウェアを1つのバージョンのMicrosoft Windowsでのみ実行し、その環境でのみテストしました。 CRANは、ほぼ定期的に、オペレーティングシステムとコアR言語ソフトウェアのバージョンの12の組み合わせの下でSallyの貢献をテストします。それらの1つがエラーを生成した場合、彼女はそのエラーメッセージを受け取ります。運が良ければ、そのエラーメッセージは、彼女が持っているハードウェアとソフトウェアでエラーを複製できない場合でも、エラーを修正するのに十分かもしれません。次に、JohnがパッケージAを使用するパッケージBをリポジトリに提供するとします。パッケージBはすべてのテストに合格し、ユーザーが利用できるようになります。後で、サリーはAの改良版を提出しますが、残念ながらBは壊れます。自動チェックにより、ジョンに情報を提供して、問題を修正できるようになります。

この例では、R寄稿パッケージシステムの長所と短所の両方を明らかにしています。CRANは寄稿パッケージのこの種の自動テストをサポートしていますが、CRANに寄稿されたパッケージは、使用する他の寄稿パッケージのバージョンを指定する必要はありません。パッケージの特定のバージョンを要求するための手順は存在しますが、寄稿者はそれらの手順を使用しない場合があります。

これに加えて、提供されたパッケージの定期的なチェックを実行するCRANなどのリポジトリは、実際には、コア言語の開発バージョン用の広範なアドホックテストスイートを提供します。サリー（上記の例）が、特に言語の開発バージョンから、理解できない、または不適切だと思うエラーメッセージを受け取った場合、彼女はコア開発チームに言語の助けを求めることができます（そして多くの場合Rで行います） 。このように、リポジトリはコア言語ソフトウェアの品質向上に貢献できます。
言語/目的パッケージ開発プロセスリポジトリインストール方法共同開発プラットフォーム自動チェックHaskellアプリケーションとライブラリを構築するための共通アーキテクチャHackage Java Maven Julia Common Lisp Quicklisp .NETNuGet NuGet Node.js npm Perl CPAN PPM PHPPEAR、ComposerPECL 、 Packagist Python Setuptools PyPI pip, EasyInstall, PyPM, Anaconda R RCMDチェックプロセス CRAN install.packages リモコン GitHub 多くの場合、12のプラットフォーム、または異なるオペレーティングシステム（Linux、Windows、macOS、およびSolarisの異なるバージョン）上の異なるバージョンのR（devel、prerel、patched、release）の組み合わせ。RubyRubyGems RubyアプリケーションアーカイブRubyForgeRustCargoCratesCargo TeX 、 LaTeX CTAN 
（この表の一部は、 Stack Overflow 「プログラミング言語別の上位リポジトリのリスト」からコピーされました）

C、C++、Fortranなど、他の多くのプログラミング言語には、ユニバーサルスコープの中央ソフトウェアリポジトリがありません。範囲が限定されている注目すべきリポジトリは次のとおりです。

 Netlibは、主にFortranとCの数学ルーチンであり、歴史的に最初のオープンソフトウェアリポジトリの1つです。
 Boost 、C ++用の高品質ライブラリの厳密にキュレーションされたコレクション。 Boostで開発された一部のコードは、後でC ++標準ライブラリの一部になりました。

 パッケージ管理システム 
パッケージ管理システムは、リポジトリとその配布の管理を支援します。リポジトリが更新された場合、パッケージ管理システムは通常、ユーザーがパッケージ管理システムを介してそのリポジトリを更新できるようにします。また、他のソフトウェアリポジトリ間の依存関係などの管理にも役立ちます。パッケージ管理システムの例は次のとおりです。
+人気のパッケージ管理システムパッケージ管理システム説明npm Node.jsのパッケージ管理システムPipPython用のパッケージインストーラー APT Debianパッケージを管理するためHomebrewAppleがインストールしなかったパッケージをインストールできるMacOS用のパッケージインストーラー vcpkg CおよびC ++のパッケージ管理システム

 リポジトリマネージャー 

 継続的インテグレーションとの関係 
開発ライフサイクルの一部として、ソースコードは継続的インテグレーションを使用してバイナリアーティファクトに継続的に組み込まれている。これは、開発者がリポジトリからアーティファクトを取得してそこにビルドをプッシュするのと同じように、バイナリリポジトリマネージャと対話する可能性がある。 CIサーバーとの緊密な統合により、次のような重要なメタデータの保存が可能になる。

 どのユーザーがビルドをトリガーしたか（手動またはリビジョン管理にコミットするかどうか）
 どのモジュールが構築されたか
 使用されたソース（コミットID、リビジョン、ブランチ）
 使用される依存関係
 環境変数
 インストールされているパッケージ

 アーティファクトとパッケージ 
アーティファクトとパッケージは本質的に異なる意味を持ちます。アーティファクトは、単にファイルの出力またはコレクションです（例： JAR、WAR、DLL、RPMなど）およびそれらのファイルの1つにメタデータが含まれている可能性があります（例： POMファイル）。パッケージは明確に定義された形式の単一のアーカイブファイルです（例：パッケージタイプに適したファイルを含むNuGet ）（例： DLL、PDB）。 多くのアーティファクトはビルドから生じますが、他のタイプも同様に重要です。パッケージは基本的に、ライブラリまたはアプリケーションの2つのうちの1つです。 

ソースファイルと比較して、バイナリアーティファクトは桁違いに大きいことが多く、削除または上書きされることはめったになく（スナップショットやナイトリービルドなどのまれなケースを除く）、通常、ID、パッケージ名、バージョン 、ライセンスなどの多くのメタデータが付随しています。

 メタデータ 
メタデータはバイナリアーティファクトを記述し、アーティファクト自体とは別に保存および指定され、さらにいくつかの用途があります。次の表に、いくつかの一般的なメタデータタイプとその使用法を示します。
メタデータタイプ用途利用可能なバージョン自動的にアップグレードおよびダウングレード依存関係現在のアーティファクトが依存する他のアーティファクトを指定しますダウンストリームの依存関係現在のアーティファクトに依存する他のアーティファクトを指定しますライセンス法令順守ビルドの日時トレーサビリティドキュメンテーションIDEのコンテキストドキュメントにオフラインでの可用性を提供する承認情報トレーサビリティ指標コードカバレッジ、ルールへの準拠、テスト結果ユーザーが作成したメタデータカスタムレポートとプロセス

 リポジトリ管理を提供するオンプレミス製品 
リポジトリを管理するためのソフトウェア（リポジトリマネージャ）には、次のものがある。

 Apache Archiva「リポジトリ管理ソフトウェア[用]ビルドアーティファクトリポジトリ」 
 Inedo's ProGet「ユニバーサルパッケージマネージャー。ワールドクラスの機能。誰でもアクセスできます。」 
 JFrog's Artifactory 
 Package Drone「OSGiのパッケージマネージャーリポジトリ」 
 Sonatype's Nexus：Ant、Ivy、Gradle、Maven、SBTなどのビルドツールで動作します。 
 Pulp「ソフトウェアパッケージのリポジトリを管理し、それを多数の消費者が利用できるようにするための無料のオープンソースプラットフォーム。サポートされているタイプ：RPM、Python、Puppet、Docker、OSTree。 " 
 Artipieオープンソースのバイナリアーティファクト管理ツール

 ソフトウェアリポジトリを提供するサービスとしてのソフトウェア製品 

 CloudRepo「完全に管理された、クラウドベースのプライベートおよびパブリックリポジトリ。」 
 Cloudsmith「パッケージ管理とソフトウェア配布の新しい標準。」 
 Dist 「クラウドでホストされている、信頼性が高く、安全で、プライベートで、高速なDockerコンテナレジストリとMavenリポジトリ。」 
 feedz.io「パッケージのホスティングと配布」 
 GitHubパッケージレジストリ
 Gitlab 
 MyGet「数千のNuGet、Bower、NPMパッケージリポジトリをホストする継続的デリバリーサービス」 
 Packagecloud「すべてのアーティファクトのための統一された、開発者に優しいインターフェース。」