しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions v2 で .NET Core (netcoreapp2.0) が使いたい

絶賛プレビュー中の Azure Functions v2 では .NET Standard 2.0 を使って開発が出来ますが、最近は .NET Standard 2.0 では API が不足していて困るケースが出てきました。

具体的には TFM として netcoreapp2.0 となる .NET Core App を使いたいわけです。

プロジェクト作成ダイアログでは、昔は .NET Core でしたが今は .NET Standard と表現が変更された点でも、あまり積極的に対応するつもりはないのかなと思っています。

f:id:shiba-yan:20180718230605p:plain

GitHub ではそれなりに Issue が上がっていますが、どうやらあまり動きはなさそうです。

ちなみに Visual Studio から Azure Functions v2 を作成して、単純に TargetFramework を netstandard2.0 から netcoreapp2.0 へ変更するとビルド時にエラーが出るようになります。

エラー内容的には Azure Functions の実行に必要なメタデータを生成する部分で失敗しています。

f:id:shiba-yan:20180718230956p:plain

Functions 自体のビルドには成功していますが、ビルド後のアセンブリを読み込んで属性から json を作成する部分で、上手くアセンブリを読めていない状態です。

原因は割と単純で、Visual Studio でビルドを行うと .NET Framework 向けの MSBuild が使われるので、netcoreapp2.0 向けのアセンブリが読み込めないという落ちでした。

なので、この場合は .NET Core 向けの MSBuild すなわち dotnet cli を使うとビルド出来ます。

f:id:shiba-yan:20180718231215p:plain

残念ながら netcoreapp2.1 向けにすると dotnet cli を使ってもエラーになってしまうので注意。

以下のコマンドで発行用にビルドが行われるので、適当に呼び出してビルドさせました。

dotnet publish -c Release

生成されたファイルは、とりあえず zip にしてから Kudu を使って直接 wwwroot 以下に配置しました。普通なら CI を使うと思うので、その場合は zipdeploy を使ってあげれば良いと思います。

f:id:shiba-yan:20180718232415p:plain

折角なので Durable Functions を追加した状態で netcoreapp2.0 としてビルドしました。元々は .NET Standard 2.0 向けに作られているので、問題なく netcoreapp2.0 でもインストールできます。

Azure Functions のランタイムバージョンは予め 2.0 に変更しておかないと詰むので注意。

f:id:shiba-yan:20180718231814p:plain

ランタイム側でもちゃんと Functions として認識されています。読み込みに失敗する場合は大体ランタイムバージョンの設定を忘れているはずです。

適当に Durable Functions のエントリポイントを叩いて、実行結果を取得してみました。

f:id:shiba-yan:20180718231730p:plain

テンプレ通りの結果ですが、ちゃんと netcoreapp2.0 向けにビルドした Azure Functions が実行出来ることを確認出来ました。問題点としては Visual Studio を使って開発できないことですね。

現状としては Visual Studio Code や Azure Functions CLI などを使うしかなさそうです。

今回の問題は .NET Framework 向け MSBuild 自身が netcoreapp2.0 向けのアセンブリを読み込もうとしているのが原因なので、メタデータの生成部分をアウトプロセスに出来れば解決しそうです。

ちなみに macOS / Linux 上で開発している場合には、最初から特に問題なく netcoreapp2.0 としてビルド出来たかも知れませんね。

追記 - Visual Studio でもビルド可能

アウトプロセスに出来れば解決しそうだと思って Azure Functions SDK のソースを適当に読んでいたら、既に設定を行えばアウトプロセスで動くようになっていました。

なので、Visual Studio でも csproj に UseNETCoreGenerator を追加すればビルド出来ます。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
    <!-- これを追加 -->
    <UseNETCoreGenerator>true</UseNETCoreGenerator>
  </PropertyGroup>
</Project>

Issue も上がってましたが、完全に見落としていました。まだ解決していない扱いみたいですが。

これで Visual Studio 上でも netcoreapp2.0 が使えて幸せになれそうですが、今のところはデバッグ実行しようとするとエラーになってしまうので、中々厳しいですね。

残念ながら Generator は netcoreapp2.0 としてビルドされているので、例によって netcoreapp2.1 としてビルドしたアセンブリは読み込むことが出来ないです。