しばやん雑記

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

.NET Core 3.0 をインストール後に Azure Functions のデプロイが失敗するケースがある

タイトルの通りですが、.NET Core 2.2 では問題なくデプロイ出来ていた Azure Functions のプロジェクトが、.NET Core 3.0 のインストール後に失敗するケースが一部で発生するようです。

先に解決策を書いておきますが、Microsoft.NET.Sdk.Functions を最新版にアップデートすれば直ります。

ビルドやデバッグ時には発生せず、デプロイ時のみエラーとなるので混乱します。

昔に作った Azure Functions プロジェクトでは、SDK が古いケースも多いと思うので Visual Studio 2019 16.3 や .NET Core SDK 3.0 をインストール後、デプロイに失敗するというパターンが割と発生しそうな予感です。

ちなみにエラーメッセージは SDK のバージョンが関係するものとは読み取りにくいです。

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

基本的には Azure Functions SDK は最新にしておいた方が良いです。昔はワイルドカードを使って自動で最新のバージョンが入るようになっていましたが、最近は固定化されるように戻ったので注意。

細かいバージョンについては面倒だったので調べていないですが、1.0.24 と 1.0.29 の 2 つを使ってエラーの有無を確認しておきました。結果は以下の通りです。

.NET Core 2.2 SDK .NET Core 3.0 SDK
Azure Functions SDK 1.0.24 OK NG
Azure Functions SDK 1.0.29 OK OK

.NET Core 3.0 SDK と古い Azure Functions SDK の組み合わせでのみ発生します。

テストには以下のようにテンプレート通りの csproj を作成し、SDK のバージョンだけ変更しました。どのバージョンから発生するかは特定していませんが、少なくとも 1.0.24 では再現します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.24" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

利用する SDK バージョンは global.json を作成して、version を 2.2.402 と 3.0.100 に変えて試しました。global.jsondotnet new globaljson を使うと簡単に作成できます。

{
  "sdk": {
    "version": "3.0.100"
  }
}

リポジトリに global.json を含めて SDK バージョンを固定しておけば発生しにくいですが、古い SDK をアップデートした方が圧倒的に手っ取り早いのと正しい解決法となります。

今のところは Azure Pipelines の各 Agent には .NET Core 3.0 SDK がプリインストールされていないので問題は発生しませんが、次の VM Image 更新でインストールされそうなので、直前で焦らないようにさっさと SDK を最新にアップデートしておいた方が良いです。

Visual Studio や Azure Functions Core Tools を使ってプロジェクトを作成する場合は、古い Core Tools がインストールされている場合は古い SDK を使ったテンプレートが使われるのも注意です。

Visual Studio の場合は自動的にプロジェクト作成時やデバッグ実行時に最新の Core Tools をインストールする仕組みになっていますが、稀に古いバージョンがインストールされる現象も発生したことがあるので SDK バージョンには気を付けましょう。