.NET CoreのクラスライブラリをNuGetパッケージにする

 ASP.NET Core MVC(.NET Core)なプロジェクトで、DLL化してあるライブラリを参照で加えて使ったら、ビルド後にエラーが出た。
An unhandled exception occurred while processing the request.

FileNotFoundException: Could not load file or assembly 'Mango, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified


 メッセージに従って実行ディレクトリを見に行ったらしっかりそのDLLはあった。DLLをローカルにコピーとかやっても解決しない…どうやら.NET Coreは参照をNuGetで解決するものらしい。だから自作ライブラリを使いたければそれをNuGetパッケージにしろということ。
How do I import a .NET Core project to another .NET Core project in Visual Studio?

 ちなみにプロジェクトの参照で解決するならわざわざNuGetパッケージ化しなくてもOK。プロジェクトの参照がダメならテスト作るのもわざわざNuGetパッケージからってことになってアレだったのでここはセーフ。





 今回は.NET CoreターゲットのライブラリをNuGetパッケージ化して、パブリックなNuGetリポジトリに上げてみるところまで。

 そもそもパッケージのターゲットをどうするかというのがある。.NET Frameworkか、.NET Coreか、はたまた.NET Standardか。
 .NET Frameworkは従来のものでもはや語るのもアレなので省略。
 .NET Coreは.NET系でクロスプラットフォームを推進するアレ。
 .NET Standardはすべての.NETランタイムで動くものを作りましょうというときのアレ。
 .NET Standardがターゲットなら、ランタイムが.NET Frameworkでも.NET Coreでも実行できるものになる。ただしもちろん、どっちかに依存のあるライブラリを使っているなら、そっちにターゲットを絞らなければならない。今回ぼくが作ったライブラリが.NET Core依存のライブラリを含んでいたので、今回は.NET Coreに絞ったわけである。
 ちなみに”ASP.NET Coreが.NET Frameworkサポートを終了”というアナウンスがあったので、ASP.NET Coreで使うライブラリならこの先は.NET Core一択で迷わなくてよくなるかもしれない。これまで.NET FrameworkでASP.NET Coreを使っていた人にはだいぶ酷なアナウンスだとも思うが。

 .NET Core向けのライブラリを作る。今ならVS2017を開いて、プロジェクトで自分の使いたい言語から.NET Coreがターゲットになっているクラスライブラリの作成を選ぶ。そしてコードを書く。ライブラリができた。ここからNuGetパッケージ化である。

 先に必要な道具を入れておく。
NuGet Package Explorer

 道具を入れたらパッケージを作る。作ってあるプロジェクトのディレクトリでPowerShellを開く。パックする。
dotnet pack --configuration release



 成功したことをメッセージで確認したら出力ディレクトリへ。.nupkgがあるのでダブルクリックすると、GUIのパッケージマネージャが立ち上がる。
 Authorなど必要情報を編集する。次にAPI KeyをNuGetウェブサイトの管理画面で取得する。パッケージマネージャにもどって「ファイル」メニューからPublishを選び、Publish Keyの欄に入れてあとはPublishボタン。


 Publishが済んだらあとは必要になったときに下記コマンド。
Install-Package [Package Name]
comment: 0