ソフトウェアリポジトリ

**ソフトウェアリポジトリ** (英: 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ディストリビューション、場合によっては特定の制限されたアプリケーションに合わせたディストリビューションを作成することができる。

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

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

コアコードのバージョンが異なり、使用する可能性のある他の提供パッケージを組み合わせて、複数のオペレーティングシステム（OS）でソフトウェアをテストできる人はほとんどいない。Rの場合、Comprehensive R Archive Network（CRAN）が定期的にテストを実行する。これがどのように価値があるかを確認するために、サリー（Sally）がパッケージAを提供すると仮定する。サリーは現在のバージョンのソフトウェアを1つのバージョンのMicrosoft Windowsでのみ実行し、その環境下でのみテストを行った。CRANは、ほぼ定期的に、OSとコアR言語ソフトウェアのバージョンの12通りの組み合わせにおいて、サリーの貢献（パッケージ）をテストする。それらのいずれかがエラーを生成した場合、彼女はそのエラーメッセージを受け取る。運が良ければ、手元のハードウェアやソフトウェアでエラーを再現できない場合でも、そのメッセージはエラーを修正するのに十分な情報となり得る。

次に、ジョン（John）が、パッケージAを使用するパッケージBをリポジトリに提供すると想定する。パッケージBはすべてのテストに合格し、ユーザーが利用可能な状態になる。その後、サリーがパッケージAの改良版を提出した際、残念ながらパッケージBが動作しなくなることがある。このとき、自動チェックによってジョンに情報が提供されるため、彼は問題を修正することが可能になる。

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

これに加え、提供パッケージの定期チェックを行うCRANのようなリポジトリは、実質的に、コア言語の開発バージョンに対する広範なアドホック・テストスイートを提供している。サリーが、特に行語の開発バージョンに起因する理解不能あるいは不適切と思われるエラーメッセージを受け取った場合、彼女はコア開発チームに助けを求めることができる（そして、Rでは実際に多く行われている）。このように、リポジトリはコア言語ソフトウェアの品質向上に貢献し得るのである。

（この表の一部は、 Stack Overflow 「プログラミング言語別の上位リポジトリのリスト」からコピーされた）

範囲が限定されている注目すべきリポジトリは次のとおりである。

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

## パッケージ管理システム
パッケージ管理システムは、リポジトリとその配布の管理を支援する。リポジトリが更新された場合、パッケージ管理システムは通常、ユーザーがパッケージ管理システムを介してそのリポジトリを更新できるようにする。また、他のソフトウェアリポジトリ間の依存関係などの管理にも役立つ。パッケージ管理システムの例は次のとおりである。

## リポジトリマネージャー

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

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

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

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

#### メタデータ
メタデータはバイナリアーティファクトを記述し、アーティファクト自体とは別に保存および指定され、さらにいくつかの用途があります。次の表に、いくつかの一般的なメタデータタイプとその使用法を示します。

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

* 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「すべてのアーティファクトのための統一された、開発者に優しいインターフェース。」 

## 関連項目

* パッケージ管理システム
* RPM Package Manager
* Synaptic
* FreeBSD Ports
* Definitive Media Library
* dpkg
* Simtel
* APTonCD

## 脚注