--- title: "ProGetでNuget (.Net) フィード ホストする方法" order: 1 hidden: true ---

NuGetは、無料のオープンソース.NETのライブラリを配布するためにMicrosoftが開発したパッケージ形式です。

NuGetのパッケージは NuGet.org で公開されており、Visual Studio または NuGet.exe のコマンドライン・クライアントから使用します。

NuGet コマンド ライン リファレンス （参照：NuGet CLI reference）

ProGet を使用すると、NuGet パッケージを使用して、非公開の独自ライブラリを配布できます。

ライブラリを配布するには、次のように NuGet フィードを作成するだけです。

[Feeds (フィード)] > [Create New Feed (新しいフィードの作成)] > [Type = NuGet]

次に、フィードを新しいパッケージソースとして使用できるように Visual Studio の設定をします。

ProGet を NuGet.org のプロキシとして使用して、不適切なライセンスやセキュリティの脆弱性をブロックし、インターネットや NuGet.org との接続が切れてしまった場合にパッケージをキャッシュしておくこともできます。

プロキシを使用するには、コネクタを作成します。

[Feeds (フィード)] > [Connectors (コネクタ)] > [Create New Connector (新しいコネクタの作成)] > [NuGet]

コネクタをフィードに関連付けます。

[Manage Feed (フィードの管理)] > [Connectors (コネクタ)]

## パッケージのインストール方法

NuGet パッケージは、 NuGet CLI を使用してインストールします。ProGetフィードからパッケージをインストールするには、次のコマンドを使用します。

（参照：Quickstart: Install and use a package using the dotnet CLI）

`NuGet install {package-name} -Version {package-version} -Source http://{proget-server}/NuGet/{feed-name}/`

## NuGet パッケージの作成と公開

NuGet のパッケージ形式については参照サイトなどに、多くの情報が公開されています。Visual Studio で作成する、または NuGet.exe を使用するなど、さまざまな方法でパッケージが作成できます。

参照： .nuspec reference

参照：Quickstart: Create and publish a NuGet package using Visual Studio (.NET Standard, Windows only)

💡
BuildMaster の NuGet パッケージのドキュメントでは、継続的インテグレーションと継続的デリバリー（CI / CD）の原則を適用し、アプリケーションと一緒に作成したパッケージを迅速にテストして配布する方法を学べます。

作成したパケージを、ProGet で公開するには次の4つの方法があります。

- ディスクからのアップロード：事前にパッケージ化された NuGet パッケージ（.nupkg）をディスクからアップロードします。
- NuGet コマンドライン・ユーティリティでプッシュする：NuGet.exe コマンドラインを使用してパッケージをローカルフィードに追加します。
- 別のフィードから pull（プル）する：別のNuGetフィード（NuGet.orgなど）からパッケージを pull（プル）します。

注：このフィードのURLについては、現時点では NuGet v2 の URL をご記入いただくことが必要です。(例 https://NuGet.org/api/v2)

- パッケージを一括でインポート/ [File Copy (ファイルのコピー)]：複数の既存パッケージを1回でインポートします

パッケージをフィードに追加する方法の詳細については、NuGet フィードの [Add Package (パッケージの追加)] ボタンをクリックしてご覧ください。

## NuGet のAPIキー

NuGet クライアントツール（NuGet.exe や NuGet パッケージ エクスプローラーなど）には、パッケージ公開の認証方法として「NuGet APIキー」を使用するオプションが備わっています。これは、コミュニティが運営の NuGet ギャラリーのサイトにおいて、誰でも自身のパッケージを公開できるようにするために、非常に重要なオプションです。しかし、企業組織内では「個々のパッケージの所有権」の概念が、しっかりと意識されているかと言うとそうではありません。

ProGet をご使用になる場合、（ユーザーまたはグループの）プリンシパルは、フィードにパッケージ公開する権限を持っているか、持っていないかのどちらかです。ProGet 管理者は、API キーなどによる管理方法ではなく、LDAP とグループを介してアクセスや利用を、簡単に制御できます。ただし、ProGet にプッシュする際に、NuGet の API キーをご使用になりたい場合には次の2つの方法があります。

- APIキーとして「username：password」を使用する：ProGet をご使用中のユーザーは、APIキーをusername：passwordの形式で使用するモードでの認証が可能です。たとえば、NuGet.exeの ApiKey Admin:Admin オプションを使用して、既定のProGet管理者アカウントでパッケージを [Feed (フィード)] にプッシュすることができます。
- ProGet API キーの作成：[Feed Access (フィードアクセス)] を使用して、ProGet で API キー（管理者・APIキー・アクセスログ）を作成します。このキーは、特定のアクセス権限を持つユーザーに限定することで、さらに制限ができます。

### レガシー NuGet のAPIキーを引き継ぐ

ProGet 5.0 以前には、 NuGet の (Quirks) フィードは [Manage Feed (フィードの管理)] のページで、APIキーの定義をサポートしていました。

ただし、ProGet 5.0 以前のキーは、ProGet 5.3 へのアップグレード時に削除されます。（参照：Legacy (Quirks) NuGet Feeds）

レガシー NuGet API キーは、ProGet API キーとは多少は異なる動作をします。認証済みのユーザーのほかに、フィードに定義されているレガシーキーの確認も実施します。そして同じキーがレガシーキーと ProGet キーの両方で定義されている場合には、ProGetキーの方を優先します。

## シンボルとソースパッケージ

ProGet の NuGet フィードは Visual Studio や WinDbg などのデバッガーとも、互換性のあるシンボルサーバやソースサーバを構成します。詳細については、「ProGet のシンボルとソースサーバ」をご参照ください。

## NuGet APIの使用について

ProGetは、サードパーティの API、NuGet ODATA プロトコルを実装しています。

NuGet.orgは、2020年3月9日にV2 ODATAクエリを非推奨にします。これがProGetに与える影響については、ナレッジベース（リンク先英語）を参照してください。

また役立つと思われる一般的なクエリも、いくつかご紹介します。

### JSON形式でフィードにある すべてのパッケージを一覧表示する

https://«proget-server»/NuGet/«feed-name»/Packages?$format=json

### ProGet フィードからパッケージを手動でダウンロードする

https://«proget-server»/api/v2/package/«feed-name»/«packageName»/«versionNumber[optional]»

### ODATAのパッケージ クエリ

https://«proget-server»/NuGet/{feed-name}/Packages?$filter=Id%20eq%20'«package-name»'

### 最新バージョンのパッケージを取得する

https://«proget-server»/NuGet/{feed-name}/Packages()?$filter=Id%20eq%20%27«package-name»%27%20and%20IsAbsoluteLatestVersion&$top=1

### NuGet V3 API

NuGet.orgとNuGet クライアント ツールはいずれも、ODATA（v2）とJSON-LD（v3）の2種のAPIプロトコルをサポートしています。ProGet 5.3 以降はどちらもサポートしていますが、以前のバージョンでは、ODATA（v2）のみをサポートしていました。

NuGet フィードで JSON-LD（v3）が有効になっている場合、v3 のAPI URLがNuGet フィードページに表示され、ODATA（v2）とJSON-LD（v3）を有効にすると、どちらもご使用いただけます。

ODATA（v2）API は、

«proget-base»/NuGet/«feed-name»

JSON-LD（v3）APIは、

«proget-base»/NuGet/«feed-name»/v3/index.json

構成には関係なく、NuGet.org へのコネクタとして、必ずhttps://api.NuGet.org/v3/index.jsonにある、JSON-LD（v3）のエンドポイントを使用することにご留意ください。（参照：https://api.NuGet.org/v3/index.json）http://NuGet.org/api/v2#v2のように、NuGet.orgのURLの末尾にオーバーライドするトークン（ #v2 ）を追加して、ODATA（v2）プロトコルを強制することができます。

## レガシーNuGet（Quirks）フィードからの移行

ProGet 5.0 より前に作成された NuGet フィードは、レガシー（Quirks）NuGetフィードと見なされます。Quirks フィードのタイプは、NuGet.org が過去に採用していた、あまり制度化されていない頃の、セマンティック バージョニング ルールに基づいています。新しい NuGet フィードがプレリリース バージョンの文字列にセマンティック バージョニング 2.0 ルール（以下SemVer2) を適用したため、ProGet 5.0 には、より洗練されたバージョニング スキームを導入しました。ただし、SemVer2 の仕様に適合しないバージョンも、SemVer2 フィードには表示されています。

レガシー（Quirks）NuGet フィードを移行するには、フィード管理ページの [migrate (移行)] リンクをクリックします。ProGet では、いくつかの移行オプションに、確認ダイアログのポップアップ表示をしています。移行を実行すると、ProGet は次の手順へと進みます。

- フィードを無効状態に設定
- 新しいメタデータ（データベース）エントリをフィードに追加
- フィードの古い（quirks）メタデータを削除
- フィードを再アクティブ化

移行はすべてデータベースでの処理で行うため、パッケージを実際に操作する必要はまったくありません。デフォルトでは、移行は単一のデータベース トランザクションとして実行されるため、万が一障害が発生した場合にはロールバックする可能性があります。フィードに非常に多くのパッケージ（10,000以上）がある場合は、移行を実行する前に ProGet SQL データベースのバックアップを実行したうえで、[migrate feed (フィードの移行)] ダイアログの適切なチェックボックスをオフにして、単一トランザクション モードは無効にしておくことを強くおすすめします。

レガシー（Quirks）の NuGet フィードは ProGet 5.3 で削除され、フィードをすべて移行するか削除しない限りは、アップグレードをブロックします。

## NuGet フィードでインデックスを再作成

ProGet では、NuGet フィードのインデックス再作成を、はじめから SemVer2 フィード（つまりレガシーではない）のシンボルサーバーとソースサーバーのインデックスを再作成するように設計しています。ProGet v5.0 以降では、さらに、次の追加アクションを実行するように修正しました。詳細は、「ProGet のシンボルとソースサーバ」をご覧ください。

- プレリリース バージョン管理とメタデータのビルドに関連する不整合を修正しました。
- パッケージストアに残っていないローカルパッケージ、またはキャッシュされたパッケージは、データベースから削除します。
- パッケージでデータベースインデックス付きの.nuspec データを修正しました。

NuGet フィードでインデックスの再作成を実行するには、NuGet、Chocolatey、または PowerShell フィードの

[Manage Feed (フィードの管理)] ページにアクセスし、[Symbol Server feed property (シンボルサーバーフィードのプロパティ)] セクションで [re-index (インデックスの再作成)] を選択してください。

## 再パッケージ化

再パッケージ化は、パッケージの内容を変更せずにパッケージのバージョンを変更するプロセスであり、プレリリース パッケージを安定版の方に変更するなどのユースケースのご提供が可能です。

ProGet は、NuGet の再パッケージ化をサポートしています。CI/CD システムで RepackagingAPI を使用して完了させる方法の例は、パブリック BuildMaster インスタンスのサンプルアプリケーションで閲覧が可能です。（参照：Repackaging API）

## パッケージの削除とリスト解除

フィードから NuGet パッケージを削除（完全に削除）またはリストから外す（検索結果では、ほぼ非表示にする）には、パッケージページに移動し、対象パッケージを [Delete Package (パッケージの削除)] または [Unlist Package (パッケージをリストから外す)] ボタンをクリックして実行します。削除やリスト解除を実行するには、Feeds_DeletePackage または Feeds_UnlistPackageそれぞれの属性でのパーミションが必要です。

プログラムでフィードからパッケージを削除するには、NuGet CLI の delete コマンドを使用するか、HTTP 経由で DELETE リクエストを作成します。（参照：delete command (NuGet CLI)）

DELETE http://{proget-server}/NuGet/{feed-name}/package/{ID}/{VERSION}`

NuGet CLI の delete コマンド操作は、パッケージをリスト解除するだけのNuGet.org の DELETE コマンドとは異なることにご注意ください。（参照：Delete a package）

プログラムでパッケージをリストから解除（または再リスト）するには、ネイティブAPIでNuGetPackagesV2_SetListed メソッドを使用します。（参照：Native API Reference）