AZFW0108:ビルド前に復元されていない拡張バンドル

Item 価値
ルール識別子 AZFW0108
Category Sdk
重症度 Warning

原因

このSDK警告は、 Azure.Functions.Sdk を使ったプロジェクトが拡張バンドルの復元フックが呼び出されていない状態で構築されたときに発生します。 ポストリストアフックは関数プロジェクトが直接復元されたときに実行されます。 ソリューションファイルやトラバーサルプロジェクトの復元は、ポストリストアフックを呼び出しません。

復元後フックが正常に実行されない場合、関数SDKはビルド前にフックを実行しようとします。 しかし、復元後フックは別のnuget復元を実行するため、ビルドの一部として実行(復元せずに)するとビルド環境によっては問題が発生することがあります。 復元後フックが dotnet restore の一部として実行されるように、こちらの手順に従うことを強くお勧めします。

ルールの説明

拡張バンドルは、関数の実行時に必要な拡張機能を含み、関数アプリケーションのトリガーやバインディングを有効にするための拡張を含む関数アプリケーションと併設されるペイロードです。

修正方法

オプション1:csprojの機能を直接復旧する

復元後フックは関数プロジェクトが直接復元された際に実行されます。

dotnet restore MyFunctionApp.csproj

オプション2:リストア対象にポストリストアフックを追加する。

Restoreターゲットは、dotnet restoreが対象となる正確なプロジェクト上でのみ動作し、参照されたプロジェクトには伝播しません。 つまり、関数アプリの復元後フック(拡張プロジェクトを生成するもの)は、ソリューションやトラバーサルプロジェクトの復元時に一度も呼び出されません。

これを修正するために、復元するプロジェクトに含めるように以下のターゲットを追加してください。 このターゲットは ProjectReference 項目を再帰的にたどり、最終的に GenerateFunctionsExtensionProject が定義されている Function App に至ります。

<Target Name="_RecursiveGenerateFunctionsExtensionProject" AfterTargets="Restore">
  <MSBuild Projects="@(ProjectReference)" Targets="_RecursiveGenerateFunctionsExtensionProject"
    SkipNonexistentProjects="true" SkipNonexistentTargets="true" />
  <MSBuild Projects="@(ProjectReference)" Targets="GenerateFunctionsExtensionProject"
    SkipNonexistentProjects="true" SkipNonexistentTargets="true" />
</Target>

このターゲットをどこに設置するかは、修復方法によって異なります:

  • ソリューションファイル(dotnet restore MySolution.sln): ターゲットを解答ファイルの隣にある Directory.Solution.targets ファイルに追加します。
  • 単一トラバーサル プロジェクト (dotnet restore dirs.proj):dirs.proj がそれをインポートすることを前提として(既定)、ターゲットを Directory.Build.targets に追加します。 トラバーサルプロジェクトの連鎖(例: dirs.proj → src/dirs.proj → MyFunctionApp.csproj)がある場合、チェーン内のすべての dirs.proj がこのターゲットを持たなければなりません。直接的または独自の Directory.Build.targetsを通じて。

警告を抑えるタイミング

抑制は推奨されません。 警告を修正するには こちら の手順に従ってください。