| 物品 | 价值 |
|---|---|
| 规则 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.proj→src/dirs.proj→MyFunctionApp.csproj),链中的每个dirs.proj项目都必须拥有该目标——无论是直接的还是通过自己的Directory.Build.targets目标。
何时应压制警告
不建议压制。 请按照 这里 的步骤修复警告。