PostBuild事件陷入无限循环,如何配置publish跳过该事件?
解决PostBuildEvent触发无限循环的问题
你配置的DockerBuild目标绑定在PostBuildEvent之后,执行dotnet publish时会重新触发完整构建流程,包括你的自定义PostBuild事件,因此导致无限循环。/p:PostBuildEvent=参数只能清空默认的PostBuild命令,无法禁用你自定义的DockerBuild目标,以下是几种可行的解决方式:
方式一:给自定义Target添加执行条件
通过判断构建是否为publish触发,让DockerBuild只在非publish构建时执行:
<Target Name="DockerBuild" AfterTargets="PostBuildEvent" Condition="'$(BuildingForPublish)' != 'true'"> <Message Text="========== PostBuildEvent - Building Docker Image ==========" Importance="high" /> <Exec Command="dotnet publish $(ProjectDir)\MyProject.csproj -c Release -o ./app/publish /p:UseAppHost=true" /> <Exec Command="docker build -t myimagename ." /> <Exec Command="docker image prune --force" /> </Target>
执行dotnet publish时,$(BuildingForPublish)会被自动设为true,此时DockerBuild目标不会执行,避免循环。
方式二:在publish命令中显式禁用自定义Target
给DockerBuild目标添加条件判断,同时在publish命令中传递参数禁用它:
<Target Name="DockerBuild" AfterTargets="PostBuildEvent" Condition="'$(DockerBuild)' != 'false'"> <Message Text="========== PostBuildEvent - Building Docker Image ==========" Importance="high" /> <Exec Command="dotnet publish $(ProjectDir)\MyProject.csproj -c Release -o ./app/publish /p:UseAppHost=true /p:DockerBuild=false" /> <Exec Command="docker build -t myimagename ." /> <Exec Command="docker image prune --force" /> </Target>
当publish命令传递/p:DockerBuild=false时,自定义Target会跳过执行。
方式三:绑定到Publish目标(推荐)
直接将DockerBuild绑定到Publish目标之后,而非PostBuildEvent,这样只有在执行dotnet publish时才会触发镜像构建,从根源避免循环:
<Target Name="DockerBuild" AfterTargets="Publish"> <Message Text="========== After Publish - Building Docker Image ==========" Importance="high" /> <Exec Command="docker build -t myimagename ." /> <Exec Command="docker image prune --force" /> </Target>
这种方式更贴合你的需求逻辑:让dotnet publish完成发布操作后,自动触发Docker镜像构建,无需在PostBuild中重复调用publish。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

