.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

.NET Core +xUnit + MongoDBなテストをTravisCIでCIする

 .NET CoreによるMSの積極的なLinux参入。VisualStudioで.NET Coreのテストを作ろうとするならxUnitを使ったテストを選べる。これをTravisCI上でのUbuntu(trusty)で走らせるところまで持っていく。

 VisualStudioで.NET CoreのxUnitテストを作る。それをコマンドラインで走らせるところから。
 ソリューションの真下の.slnのあるディレクトリで、restoreとbuildを行う。
dotnet restore

dotnet build

 そんでテスト。テストはテストプロジェクトのあるディレクトリに移動して行う。
dotnet test



 テストが済んだことを確認したら、それをTravisCIで行えるようにする。.travis.ymlの用意。今回はMongoDBを使うのでその設定も。
.travis.yml

sudo: false
language: csharp
mono: none
dotnet: 1.0.1
dist: trusty
services:
- mongodb
addons:
apt:
sources:
- mongodb-upstart
- mongodb-3.0-precise
packages:
- mongodb-org-server
- mongodb-org-shell

install:
- dotnet restore
script:
- dotnet build
- cd FoobarTests
- dotnet test


 上記のものを利用してじっさいにTravisCIに上げてみたのが↓のプロジェクト。



https://travis-ci.org/hMatoba/Mango
comment: 0

ASP.NET MVC: ユニットテストを用意してみる

 ASP.NET MVCでユニットテストを作成してみる。訳を作ったMSのドキュメントを参考にしながら。
https://github.com/hMatoba/ASP.NET-Core-doc/blob/master/ユニットテスト.rst

 まずVisualStudioでWebアプリのソリューションを作っておく。そしてルートの下にsrcとtestというディレクトリがあることを確認する。


 testディレクトリに入り、下記のコマンドを実行する。
dotnet new -t xunittest


 するとtestディレクトリ下に二つのファイルが生成される。このうちのproject.jsonを、VisualStudioのソリューションエクスプローラから、ソリューションに既存の項目として追加する。するとVisualStudioがファイルをさらに追加してくれる。これでテストプロジェクトがソリューションに加わったことになる。


 あとはガリガリとテストを追加していくだけ。テストはテストエクスプローラから実行できる。


comment: 0

Azure: GithubからWeb Appsへデプロイ

 このブログはAzureで運用している。これまでコードのデプロイはVisualStudioを使って行っていたが、Githubでバージョン管理を行っているので、Githubにデプロイまでを一括して行ってもらうことにする。

 まずAzureの管理者コンソールを開いて、デプロイオプションを開く。さまざまなデプロイ方法が出てくる。

--------------

 Githubを選んでGithubへとび、認証を済ませてAzure→Githubのアクセス許可を与える。

--------------

 以上で設定は終わり。あとはGithubへデプロイすればデプロイまで自動で行われる。

--------------

 Azureコンソールではデプロイ履歴を追うこともできる。
comment: 0

ASP.NET MVC: ASP.NET MVCアプリを.NET Coreへ移植

 このブログのエンジンのフレームワークとしてASP.NET MVCを使っているが、.NET Framework上で動作するものを使っていた。今年の春だったか夏にLinuxなどへも移植を可能にした.NET Coreがリリースされており、もともとこれで動かすつもりだったのでブログエンジンをon .NET Frameworkからon .NET Coreへ移植した。

 
 実際の移植作業としてやったのは、
・プロジェクト立て直し
・依存ライブラリ入れ(.NET Core対応のものにする)
・ビュー、コントローラ、モデルもろもろコピペ移動
・動かなくなっている組み込みクラスの代替(一つだけだった)
という程度だった。VSで新しいプロジェクト作って、そこでNugetでライブラリ入れて、ファイルをコピペでプロジェクトに入れて、動かなくなったクラスを一つ書き換えた。30分程度で済んだ。
 動かなくなったのはセキュアなトークンの発行メソッドである。なので・・・
using System.Security.Cryptography;

を入れて、
private static string GetToken()

{
var rng = RandomNumberGenerator.Create();
var buff = new byte[25];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);
}

のようなトークン生成関数を用意した。もともとあったのは下記のメソッド。
private static string GetToken()

{
var token = "";
using (var rng = new RNGCryptoServiceProvider())
{
byte[] tokenData = new byte[32];
rng.GetBytes(tokenData);

token = Convert.ToBase64String(tokenData);
}

return token;
}



 あとproject.jsonでランタイムの指定が必要かも。テストする環境やデプロイするサーバの環境をターゲットに指定する。
"runtimes": {

"win8-x86": {},
"win10-x64": {}
},


 .NET Coreへのアプリ移植は案の定、楽に進んだ。大筋問題ないようなので、あとは細部がおかしなことになっていないか確認していく。
comment: 0