VS2017 Azure函数项目:如何显式设置NuGet包构建目标顺序?
搞定Azure Functions和OctoPack的构建目标顺序问题
嘿,这个问题我碰到过好几次了,其实核心就是用MSBuild的目标依赖规则来强制指定顺序——毕竟哪怕你按顺序引用了NuGet包,只要两个目标都挂在Build之后执行,它们的先后顺序是没保障的。给你几个实用的方案:
方案一:让OctoPack等Functions的PostBuild做完再跑
这个方法最稳妥,相当于给OctoPack加个“等待指令”:
- 打开你的项目
.csproj文件 - 在文件最后(所有导入的目标之后)加这段配置:
这样一来,OctoPack只会在<!-- 先关掉OctoPack默认的Build后自动触发 --> <PropertyGroup> <OctoPackRunAfterBuild>false</OctoPackRunAfterBuild> </PropertyGroup> <!-- 新建一个目标,等Functions的PostBuild完成后再调用OctoPack --> <Target Name="RunOctoPackAfterFunctions" AfterTargets="_GenerateFunctionsPostBuild"> <CallTarget Targets="OctoPack" /> </Target>_GenerateFunctionsPostBuild彻底执行完才启动,完全不会乱序。
方案二:直接改OctoPack的执行时机
如果你不想关掉OctoPack的默认触发,也可以直接修改它的执行挂钩点:
<!-- 覆盖OctoPack的目标设置,让它在Functions PostBuild之后跑 --> <Target Name="OctoPack" AfterTargets="_GenerateFunctionsPostBuild" DependsOnTargets="$(OctoPackDependsOn)" />
这里保留了OctoPack原有的依赖项$(OctoPackDependsOn),不会破坏它原本的打包逻辑,只是调整了启动时机。
方案三:给Functions的PostBuild加前置约束
反过来,我们也可以让_GenerateFunctionsPostBuild明确在OctoPack之前执行:
<!-- 调整Functions的PostBuild目标,确保它在OctoPack启动前完成 --> <Target Name="_GenerateFunctionsPostBuild" BeforeTargets="OctoPack" AfterTargets="Build" />
这个配置保留了原目标“Build之后执行”的规则,同时新增了“OctoPack之前执行”的约束,双保险。
怎么验证顺序对不对?
你可以打开Visual Studio的详细构建日志看看:
- 右键项目 → 属性 → 生成 → 把日志级别改成“详细”
- 构建项目后,在输出窗口搜
_GenerateFunctionsPostBuild和OctoPack,确认它们的顺序是你想要的就行。
内容的提问来源于stack exchange,提问作者David Gard
相关产品推荐
相关产品推荐

