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

この謎のブログタイトルの由来を知るものはもういないだろう

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を今後使っていこうかなと思いました.

Xamarin.Forms 3.0.0系のpreがNuGetから取得できるようになりました

ついにvNextである3.0系がNuGetから取得できるようになりました:clap:

www.nuget.org

今までは3.0系やearly-releaseを試す場合はXamarin-ciでビルドされるNuGetパッケージを自分で導入したり(こんな感じでプロジェクトのルートにNuGet.Configを置く方法もあります),Xamarin.Formsのリポジトリをクローンして自前ビルドしたものを使用したりということが必要でしたが,今回のリリースで容易に試すことができるようになりました.

さて,それでは3.0系になると何が追加されるのかを,Releaseのページから少しだけ探っていきましょう.

FlexLayout

最近(2018年2月)のXamarin関連で気になっていること - 窓を作っては壊していた人のブログ

以前にも取り上げましたが,Web系の方におなじみのFlexbox(XFではFlexLayoutと呼称)が追加されます. FlexLayoutは横並びの要素には非常にパワフルに作用し,コンテナに対して何割のサイズで幅を占有するだったり,とある個数のエレメントを均等幅で配置するといったことが容易に行えるようになります.

P3PPP氏がすでに試しているようで,ブログにも試したみた系の記事が載っているようです.

Xamarin.Forms.FlexLayout - ぴーさんログ

私も現在趣味で作っているXamarin.Formsを使ったmacOS向けアプリケーションに導入しています.

CSSサポート

XFはWeb系の人を取り込みたいのか!って感じではありますね. CSSのサポートも今回のリリースから行われます.

こちらについてもP3PPP氏がいい感じにまとめてくださっているので,こちらを参考にしてみてください.

Xamarin.Forms CSS Support - ぴーさんログ

今までは共通の色設定などを以下のリンクのコードのように定義していたのですが TonpeiFes2017/App.xaml at master · yamachu/TonpeiFes2017 · GitHub

これをCSSのファイルにまとめたりすることが出来るようになったので,明確にデザインという工程を分割できそうになるのかなと感じました.

VisualStateManager

こちらはあるコントロールの状態ごとに見た目を変えることが出来るようにする機能です. たとえばフォームのバリデーションを行っていた場合,不正な場合は赤い色でLabelの背景を変えるとか,そういう感じのときに使います.

自分のサーベイ不足かもしれませんが,今までは状態に応じて色を変えたりする場合,ReactivePropertyなどを使ってbool値を受け取りxamlでConverterを通してごにょごにょという手段しか知らなかったので,バリデーションの結果に応じて状態を変えることで見た目も変えることが出来るというのは非常に便利かなと思っています.

これ,使い方によっては上で追加されたCSSと組み合わせられるかしら...要検証ですね.

RTL Support

グローバルなアプリケーションを作成している方にとっては朗報なのではないでしょうか. 企業レベルでXamarin.Formsを採用するとなると,こういうことも出来てほしいという要望はそこそこあるようですし.

ターゲットのバックエンドの追加

WPFGTK,Tizenのバックエンドが追加となりました(macOS普通に使ってるけど,これ以前に追加ってされてましたっけ)

.NETStandardへ移行

こちらNupkgの中身を見てもらうとよくわかると思うのですが,PCLのパッケージが消え,代わりにnetstandard2.0が追加されるようになりました.

それに伴い

Windows Phone 8,8.1のサポート終了

となりました.

このように大きめの機能追加などが取り入れられた3.0系,まだまだ多くのバグの修正や機能追加が含まれています. まだpreではありますが,試してみてはいかがでしょうか.

GitHubのprojectに記載されている残りのタスクはわずかに見えます.

vNext (Target 3.0.0) · GitHub

正式リリースが待ち遠しいですね.