窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

AzureFunctions + .NET Core に入門するとき参照パッケージのバージョンとAdd-inのバージョンで詰まった話

Macでのお話で,おま環かもしれないので,ちょっとしたメモ扱いです.

2018/3/31追記: おま環というより,パッケージのバージョンのせいでした

ご存知の方もいらっしゃるかと思いますが,現在Visual Studio for Macのベータおよびアルファチャンネルで配信されている Visual Studio for Mac 7.5.0.933 にバンドルされている AzureFunctions のAdd-inのバージョンが上がったため,AzureFunctions v2がデフォルトのテンプレートになり,それに伴い.NET Coreを使用するようになりました. そこまではGood Newsなのですが,上記のバージョンのAdd-inで作成したAzureFunctionsは現時点Visual Studio for Macで起動することが出来ません(要他の環境での検証).

エラーの内容としてはアセンブリが見つからねえよっていう内容なのですが,

 System.Private.CoreLib: Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Abstractions, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621). System.Private.CoreLib: Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Abstractions, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

Publishされたdllのバージョンなどを調べてもあっているように見えます.

2018/3/31追記: Visual Studio for macMonoDevelop.AzureFunctionsのAdd-inのディレクトリを潜ってみたら,該当のDLLが配置されていて,そのバージョンが2.0.0.0でした. またその他にもAzureFunctionsをローカルで起動するためのnodeの実行環境およびazure-functions-cliがバンドルされていました.

少し説明に自信がありませんが,そのcliとadd-inに含まれるDLLを使ってビルドしたDLLを起動するための実行環境を起動し,動的にDLLを呼び出し実行している感じになっているのだと思いました.

Edge.jsだとpublishを行った際に出力されるdependentなパッケージを管理するjsonを読み込み,動的に参照に加える,といったことをしていたので,おおむねそういったことをしているのでしょう(この辺りはRoslyn for Scriptingでスクリプトの実行環境を動的に生成し,最初から参照させるアセンブリを指定するのと同じような感覚かな). で,上記のような感覚で後から参照しているものを読み込んでいるのであれば,publishしたところのアセンブリを参照してくれという感じではありますが,どうもだめみたいですね.

いろいろこれが原因かなとか書いてきましたが,要はバージョンを合わせるためにはソリューション生成時に使用されたテンプレートのまま,Microsoft.NET.Sdk.Functions の 1.0.6 を使用すればいいということでした(この場合Microsoft.NET.Sdk.Functionsが依存しているパッケージの内部で参照しているバージョンが,Add-inに含まれるものと同等のバージョンのため).

同様の理由で.funcコマンド,すなわちazure-functions-cliを使用する場合は,その入れたバージョンが実行環境として持っているバージョンと同じバージョンを含むMicrosoft.NET.Sdk.FunctionsをNuGetで入れなおせば動作します.

このまま終わっても気分が悪いので,今回のケースはAzureFunctionsをローカルで起動させてデバッグをするAdd-in自体の問題なのか,それともビルドに使用するテンプレートの問題なのかを調べるため, AzureFunctionsのCLIVisual Studio CodeのAzureFunctions Extensionを使って検証してみました.

結果としてはよくわからん,というのが実際のところでした.

VS4MでPublishしたのが問題なのかと思い,dotnetコマンドでpublishを行ったものをfuncコマンドで実行しても同様のエラーが発生しました. しかしVisual Studio Codeで起動させるとデバッグもうまくいくのです.

このあたり何が違うのかなというのがまだわかっていないので,今後も検証を続けていこうと思います.

前述したように,Microsoft.NET.Sdk.Functionのバージョンを直せば問題ない,ということで話はまとまります.

こういったちょっとしたつらみを経験して思ったのは,テンプレートがよしなにやってくれるものはそれを十分に活用しようということでした.

そう考えるとVisual Studio Codeを使うのが結構いい選択に思えてきます. なんといってもソリューションを作るのも,Functionsを追加するのもExtensionがすべて面倒を見てくれるので.

IDEに搭載されるAdd-inはバージョンアップが遅そうな印象があるため,VSCodeまたはazure-functions-cliを今後使っていこうかなと思いました.