ソフトウェアリポジトリ

ソフトウェアリポジトリ (英: 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で行います） 。このように、リポジトリはコア言語ソフトウェアの品質向上に貢献できます。
（この表の一部は、 Stack Overflow 「プログラミング言語別の上位リポジトリのリスト」からコピーされました）
C、C++、Fortranなど、他の多くのプログラミング言語には、ユニバーサルスコープの中央ソフトウェアリポジトリがありません。範囲が限定されている注目すべきリポジトリは次のとおりです。
パッケージ管理システム.
パッケージ管理システムは、リポジトリとその配布の管理を支援します。リポジトリが更新された場合、パッケージ管理システムは通常、ユーザーがパッケージ管理システムを介してそのリポジトリを更新できるようにします。また、他のソフトウェアリポジトリ間の依存関係などの管理にも役立ちます。パッケージ管理システムの例は次のとおりです。
リポジトリマネージャー.
継続的インテグレーションとの関係.
開発ライフサイクルの一部として、ソースコードは継続的インテグレーションを使用してバイナリアーティファクトに継続的に組み込まれている。これは、開発者がリポジトリからアーティファクトを取得してそこにビルドをプッシュするのと同じように、バイナリリポジトリマネージャと対話する可能性がある。 CIサーバーとの緊密な統合により、次のような重要なメタデータの保存が可能になる。
アーティファクトとパッケージ.
アーティファクトとパッケージは本質的に異なる意味を持ちます。アーティファクトは、単にファイルの出力またはコレクションです（例： JAR、WAR、DLL、RPMなど）およびそれらのファイルの1つにメタデータが含まれている可能性があります（例： POMファイル）。パッケージは明確に定義された形式の単一のアーカイブファイルです（例：パッケージタイプに適したファイルを含むNuGet ）（例： DLL、PDB）。 多くのアーティファクトはビルドから生じますが、他のタイプも同様に重要です。パッケージは基本的に、ライブラリまたはアプリケーションの2つのうちの1つです。 
ソースファイルと比較して、バイナリアーティファクトは桁違いに大きいことが多く、削除または上書きされることはめったになく（スナップショットやナイトリービルドなどのまれなケースを除く）、通常、ID、パッケージ名、バージョン 、ライセンスなどの多くのメタデータが付随しています。
メタデータ.
メタデータはバイナリアーティファクトを記述し、アーティファクト自体とは別に保存および指定され、さらにいくつかの用途があります。次の表に、いくつかの一般的なメタデータタイプとその使用法を示します。
リポジトリ管理を提供するオンプレミス製品.
リポジトリを管理するためのソフトウェア（リポジトリマネージャ）には、次のものがある。