Blazor Wasm PWA(AOT)预发布PowerShell脚本重复执行问题
解决Blazor Wasm PWA发布时预脚本重复执行的问题
问题背景
开发带AOT的Blazor Wasm PWA时,在项目文件中添加了如下预发布PowerShell脚本配置,但脚本会执行两次:
<Target Name="PrePublishScript" BeforeTargets="PrepareForPublish"> <Exec Command="powershell -ExecutionPolicy Bypass -File script.ps1" /> </Target>
通过msbuild WRCT.csproj /t:Publish /p:Configuration=Release /v:diag > build.log生成的诊断日志可知,PrepareForPublish被包含在_CorePublishTargets和_PublishNoBuildAlternativeDependsOn两个目标组中,因此被触发两次。
可行解决方案
方案1:使用_GatherBlazorFilesToPublish作为前置目标
你尝试将BeforeTargets改为_GatherBlazorFilesToPublish后脚本仅执行一次,这个目标是合规的——它是Blazor发布流程中专门用于收集待发布文件的内部目标,在AOT编译、压缩等核心发布步骤前仅执行一次,完全适合作为预发布脚本的触发点。修改后的配置:
<Target Name="PrePublishScript" BeforeTargets="_GatherBlazorFilesToPublish"> <Exec Command="powershell -ExecutionPolicy Bypass -File script.ps1" /> </Target>
方案2:给目标添加Condition避免重复执行
通过自定义属性标记脚本已执行,即使PrepareForPublish触发多次,也只会执行一次:
<Target Name="PrePublishScript" BeforeTargets="PrepareForPublish" Condition="!$(PrePublishScriptExecuted)"> <Exec Command="powershell -ExecutionPolicy Bypass -File script.ps1" /> <PropertyGroup> <PrePublishScriptExecuted>true</PrePublishScriptExecuted> </PropertyGroup> </Target>
方案3:使用PublishDependsOn扩展发布依赖
采用MSBuild扩展发布流程的标准方式,将自定义目标插入到发布核心依赖链中,确保只执行一次:
<Target Name="PrePublishScript"> <Exec Command="powershell -ExecutionPolicy Bypass -File script.ps1" /> </Target> <PropertyGroup> <PublishDependsOn>PrePublishScript;$(PublishDependsOn)</PublishDependsOn> </PropertyGroup>
总结
- 优先推荐方案1,贴合Blazor发布特定流程,逻辑最清晰;
- 方案2适合需要兼容更多场景的情况;
- 方案3是通用性更强的MSBuild标准扩展方式。
内容的提问来源于stack exchange,提问作者Flippowitsch
相关产品推荐
相关产品推荐

