Nuget、登録の時間です!

今回、自作のライブラリを NuGet Gallery に公開したので、その時の手順を備忘録的に残しておきます。
目次
尚、このエントリは Visual Studio 2022 Community Edition で .NET 7 以降 と C# を使用するエントリなので、C# での基本的なコーディング知識を持っている人が対象です。
NuGetにアカウントを作成
NuGet に自作のライブラリ等を公開したい場合、まずは、前準備として NuGet Gallery にアカウントを作成する必要があります。既に持っている人は… こんなページは見ないと思いますが、既に持っている人は本章をスキップしてください。
NuGet Gallery は Microsoft アカウントか、GitHub のアカウントで登録できます。(2023/7 現在 他のアカウントが使用できるのかは分かりません)Microsoft アカウントであれば 登録中に新規アカウントを作成する事ができるようですが、GitHub アカウントを使用したい場合は、あらかじめ アカウントを取得する必要があります。
NuGet Gallery にアカウントを作成するため NuGet Gallery をブラウザで開きます。
2023/6 現在の NuGet Gallery は fig. 1 のようなページです。
サイトのデザインが変わっている場合もあるので、参考程度と思ってください。

fig. 1 NuGet Gallery サイト
一般的に登録が必要なサイトでは【Sign in】と【Sign up】の両方のリンクが用意されている事が多いと思いますが、NuGet Gallery には【Sign in】のリンクしかなく少し迷いました。サインアップも【Sign in】のリンクから可能でした。
【Sign in】をクリックすると fig. 2 のページが開きます。ぱっと見、Microsoft アカウントしか使えないように見えますが、赤枠で囲んだ【Sign in with Microsoft】ボタンから GitHub アカウントで登録する事も可能です。
※ 登録後完了後に再度、サインインする場合も同じ手順です。

fig.2 Sign ページ
【Sign in with Microsoft】ボタンをクリックすると fig. 3 のページに遷移します。
※ 既に NuGet Gallery に登録済みの場合は【サインインオプション】ボタンの下に登録したアカウントが表示されているので、それをクリックしてサインインできます。

fig.3 サインインオプション
【サインインオプション】ボタンをクリックすると fig. 4 に遷移するので、アカウントを選択します。

fig.4 サインインオプション選択
管理人は GitHub のアカウントで登録したので他の方法は分かりません。
【GitHub アカウントでサインイン】を選択すると、GitHub アカウント入力画面になるので手持ちの ID とパスワードを入力してサインインすると、アカウントの登録が完了します。
NuGet Gallery に登録するパッケージの準備
次に NuGet Gallery に登録するパッケージを準備します。
準備と言っても、通常通り Visual Studio でクラスライブラリプロジェクト等を作成するだけですが、プロジェクトのプロパティを整備する必要があるので、公開したいプロジェクトのプロパティを開いて fig. 5 の【パッケージ】を開きます。

fig.5 プロジェクトのプロパティ – パッケージ
パッケージの各項目は NuGet Gallery の配布ページに表示される内容になるので、極力埋めた方が良い(できれば DeepL 等で英訳した方が良さそう)と思います。以下は入力必須と考えた方が良いと思います。
- パッケージバージョン
- 説明
- 著作権
- ライセンス
又、パッケージのアイコンを設定したい場合は、128px × 128px の png 又は jpg ファイルを用意して【アイコン】に指定すれば、デフォルトアイコンから変更できます。
パッケージ ライセンス
Visual Studio のプロジェクトのプロパティ – パッケージライセンスは fig.6 のようにデフォルトで『なし』が設定されています。

fig.6 パッケージ ライセンス デフォルト
『ライセンス なし』で作成したパッケージも登録可能でしたが、登録時に警告が出るので、できれば適切なライセンスを設定した方が良いと思います。
ライセンスは大きく分けて【オープンソース(以下、OSS)か、それ以外】の 2 パターンがあり、OSS ライセンスで公開したい場合は【パッケージ ライセンス】に【SPDX ライセンス式】を選択し、それ以外の場合は【埋め込みファイル】を選択します。(管理人は【埋め込みファイル】を選択した事が無いので設定方法は確認していません)
SPDX ライセンス式を選択した場合は、【ライセンス式】を指定する必要があり、【SPDX ライセンス式について】に一覧されている【Identifier 列】の識別子をコピーして貼り付けます。
管理人は【Apache License 2.0】で公開するので、fig. 7 のように設定しました。

fig.7 SPDX ライセンス式
【SPDX ライセンス式について】のページは fig. 7の赤枠内【SPDX ライセンス式について】のリンクからも開くことができます。『チェックボックス:ライセンスの同意が必要』は、Nuget からインストールする際に同意画面を表示するかどうかだと思うので、同意画面を表示したい場合はチェックします。
パッケージ ID
ここではパッケージの登録時に注意が必要な【プロジェクトのプロパティ – パッケージ – パッケージ ID】について書いておきます。
パッケージ ID は fig. 8 のように【NuGet Gallery 内で一意にする必要がある】と書かれていますが、デフォルト値(Visual Studio の環境変数 $(AssemblyName)
)が指定されているので管理人は気付かず、読み飛ばしていました。

fig.8 パッケージ ID
$(AssemblyName)
は基本的に、新規プロジェクト作成時に入力するプロジェクト名とイコールなので、例えば、プロジェクト名を『hogefoobar.csproj
』にした場合のパッケージ ID は【hogefoobar
】になります。つまり、既に『hogefoobar
』が登録済みの場合はエラーになり、NuGet Gallery への登録に失敗します。
詳しくは『3.1 パッケージ ID の重複』で後述するので、ここでは【パッケージ ID】が重複している場合はアップロードできないと言う事だけ覚えておいてください。
NuGet パッケージの作成
【プロジェクトのプロパティ – パッケージ】の入力が完了したら、公開用の【nupkg
】を作成します。
公開用パッケージの作成は、ソリューション構成を【Release】にして、fig. 9 のようにソリューションエクスプローラーで対象プロジェクトを右クリックして【パック】をクリックします。

fig.9 プロジェクトのパック
パックを実行すると【プロジェクトのプロパティ – パッケージ】の【パッケージ出力パス】に指定した場所(通常はアセンブリの出力場所と同じ)へ【.nupkg
】が出力されれるので、ファイルが作成されていればパッケージの準備は完了です。
NuGet Gallery への登録
NuGet Gallery への登録方法は以下の 3 パターンがあるようです。
- ブラウザから手動登録
- nuget.exe を使用してコマンドラインから登録
- dotnet CLI で登録
ここでは準備が特に必要ない【ブラウザから手動登録】する方法のみ紹介します。
まず、NuGet Gallery をブラウザで開いてサインインします。
サインインすると fig. 10 のトップページが開くので、赤枠で囲んだ【Upload】をクリックします。

fig.10 Nuget トップページ
fig. 11 の Upload ページが開くので、【Browse… ボタン】をクリックして前章で作成したパッケージを選択します。

fig.11 Upload ページ
ここで選択したパッケージのパッケージ ID が既に登録済みのパッケージの ID と被った場合は、『The package ID is reserved. You can upload your package with a different package ID. Reach out to support@nuget.org if you have questions.』と言うエラーメッセージが表示されて、Upload に失敗します。
上のエラーメッセージが表示された場合はパッケージを再作成する必要があります。
パッケージ ID の重複
『2.2 パッケージ ID』にも書いたように、同じパッケージ ID が既に登録済みの場合、エラーとなり登録できませんが、事前に回避する方法があるかと言えば、Upload してみないと分からない場合もありそうです。
今回の管理人の場合、 『パッケージ ID:Carnival.Core
』を登録しようとしてエラーになりましたが、事前に NuGet で『Carnival
』を検索してもヒットしませんでした。
なので、事前に確認しても登録時にパッケージ ID 重複エラーは出る事もあるようなので、Upload してみるしか確認の方法は無いような気がします。
パッケージ ID 重複の回避策を探して、上に書いたエラーメッセージを検索すると、ドンピシャで【Not able to upload a Nuget Package | Stack Overflow】がヒットしました。
書かれている対策を確認すると、fig. 11 の【プロジェクトのプロパティ – アプリケーション – 全般 – アセンブリ名】と【既定の名前空間】に会社名等を追加してパッケージ ID の競合を避けると書かれています。

fig.12 プロジェクトのプロパティ – アプリケーション – 全般 – アセンブリ名
アセンブリ名はパッケージ ID のデフォルト値なので、変更が必要なのは分かりますが、もう 1 つの方は『既定の名前空間…?』と思いました。ですが、既定の名前空間はデフォルトでアセンブリ名とイコールなので、クラス名の重複を避けるためだろうと思っています。
ただ、既定の名前空間を変更しても既存のソースコードに書かれた名前空間は変わらないので、既存のソースコードは手動で変更する必要があります。アセンブリ名と既定の名前空間を共に『HalationGhost.Carnival.Core』に変更して、既存ソースコードの名前空間も変更した後、再パックして、再度 Upload するとエラーは発生せず、無事アップロードできました。
パッケージ Upload 完了後
パッケージ ID の重複のようなエラーが発生せずアップロードできると、fig. 13 の画面が表示されます。

fig.13 パッケージの登録
実はパッケージ ID を変更して再 Upload した際に、ライセンスを設定し忘れていて、fig. 13 の画面に遷移する前にライセンスの警告が出てしまい、再々度 Upload し直しましたが…
とりあえず、fig. 13 のようにページ最下部に【Submit ボタン】が表示されれば Upload は完了です。管理人の場合は【パッケージ ID の重複】と【ライセンス未設定の警告】が出ただけで fig. 13 まで進むことができましたが、他にエラーが出る場合もあるのかもしれません。
fig. 13 の【Submit】をクリックすると、fig. 14 の画面が表示されます。

fig.14 パッケージ登録完了
fig. 14 は NuGet Gallery のパッケージ配布ページですが、黄色で塗りつぶされた注意文も表示されています。まあ、注意と言っても『登録されたけど、実際の検索結果に表示されるまで1時間程度は待ってね!』と書かれているだけで、1時間後に確認すると、注意文も消え、検索にヒットするようになりました。
2023/6/25 現在では fig. 15 のように表示されます。

fig.15 Halation.Ghost.Carnival.Core Nuget ページ
実際の登録日から約 1 週間程度しか経っていませんが、何故か 33 ダウンロードもされていました。NuGet Gallery と GitHub の ReadMe に何も書いていないのに物好きな人もいるもんだと思いましたw
このように、ブラウザからの Upload は簡単お手軽にできました。
バッチや CI からアップロードしたい場合は、fig. 15 ページ上部の【Download】から実行用ファイルがゲットできます。方法については【Documentation】に書かれていますが、機会があればエントリを書いてみたいとは思ってます。
NuGet Gallery でのパッケージ配布は、【パッケージ ID の重複】だけに気を付ければ特に迷うこともなく簡単な手順でした。