AZFW0108:构建前未恢复扩展包

物品 价值
规则 ID AZFW0108
Category Sdk
Severity Warning

原因

当使用 Azure.Functions.Sdk 的项目在未调用扩展捆绑包的还原后挂钩的情况下生成时,就会出现此 SDK 警告。 当函数项目被直接还原时,会运行还原后钩子。 恢复解答文件或遍历项目不会调用恢复后钩子。

当恢复后钩子未能成功运行时,函数SDK会尝试在构建前运行该钩子。 然而,由于还原后钩子自身还会再次执行一次 NuGet 还原,如果它作为构建过程的一部分运行,而不是作为还原过程的一部分运行,则可能会因构建环境不同而引发问题。 强烈建议按照此处的步骤进行操作,以确保恢复后钩子作为 dotnet restore 的一部分运行。

规则描述

扩展捆绑包是一个与函数应用一同部署的部署包,其中包含 Functions 运行时为启用函数应用的触发器和绑定所需的扩展。

如何修复

选项1:直接恢复csproj功能

当函数项目被直接恢复时,将运行恢复后钩子。

dotnet restore MyFunctionApp.csproj

选项二:为恢复目标添加恢复后钩子。

Restore目标只运行在被针对的具体项目dotnet restore上——不会传播到被引用的项目。 这意味着函数应用的恢复后钩子(生成扩展项目)在恢复解决方案或遍历项目时从未被调用。

要解决这个问题,可以添加以下目标,使其包含在被恢复的项目中。 该目标会递归遍历 ProjectReference 项,最终到达定义了 GenerateFunctionsExtensionProject 的函数应用。

<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): 将目标添加到 Directory.Build.targets,前提是 dirs.proj 会导入它(默认情况)。 如果你有一条遍历项目链(例如, dirs.projsrc/dirs.projMyFunctionApp.csproj),链中的每个 dirs.proj 项目都必须拥有该目标——无论是直接的还是通过自己的 Directory.Build.targets目标。

何时应压制警告

不建议压制。 请按照 这里 的步骤修复警告。