Post-发布配置文件 XML 下的发布脚本,以便在实际发布之前调用 IIS

Post-Publish Script under Publish Profile XML for IIS getting called before actual publish

我正在尝试弄清楚 Pre-PublishPost-Publish 脚本如何与来自 Visual Studio 2019IISMSBuild 部署一起工作。

下面是我的 customprofile.pubxml 文件:

当我发布输出时 windows 打印消息但是 Post-Publish 也发生在实际发布之前。

不确定这里发生了什么。

实际上AfterPublishBeforePublish 用于 ClickOnce 发布(windows 项目发布)而不是 Asp.Net web项目发布。

您显示的内容并不能证明目标 AfterPublish 在构建过程中执行,而只是在构建日志中列出。

请在 Tools-->Options[下将 MSBuild project build output verbosity 设置为 Diagnostic =175=]-->Projects and Solutions-->Build and 运行获取详细日志

a similar case about this issue.

=======================================

我建议你做这个测试:

测试

我写了一个错误目标:

<Target Name="BeforePublish">
    <Exec Command="123">
    </Exec>
  </Target>

如果项目在发布过程中检测到错误,则表示项目具有系统目标。

Winform项目检测到错误,而web项目没有。

事实上,当你点击网络项目上的发布按钮时,它实际上执行了WebMSDeployPublish,因为网络发布确实不包含 AfterPublishBeforePublish 目标,您应该在它们上指定一个 dependenttarget。

解决方案

使用这些:

<Target Name="BeforePulish" BeforeTargets="GatherAllFilesToPublish">
.....

</Target>

<Target Name="AfterPublish" AfterTargets="GatherAllFilesToPublish">

.......

</Target>

============================================= ==

更新 1

很抱歉没有详细列出有关该问题的所有提示。

问题应该分为两种情况:

============================================= ==

网络框架项目

对于Net Framework web 项目发布,

实际上Net Framework项目中,没有明显的系统默认目标BeforePublishAfterPublishGatherAllFilesToPublish是核心的发布步骤,也是发布过程中执行的最后一个目标。

但是net framework web publish process下的所有target运行在生成publish文件夹后,都和BeforePublish一样。

Net Framework Web Publish的特色。将所有文件复制到发布文件夹是在发布过程的最后一个目标之后。因此,您不能创建依赖于最后一个默认系统目标的自定义目标。这很烦人。至少在默认情况下,您不能创建任何自定义目标来对 Net Framework Web Publish 案例中的发布文件进行任何更改。

生成publish文件夹后可以看到没有其他系统自定义目标运行s

但是,我为您提供了一个解决方案,它可能有点复杂。生成publish文件夹后就可以工作了。

解决方案

1) 首先,你应该安装一个名为 MSBuild.Extension.Pack 的 nuget 包,它是 msbuild 任务的额外扩展。

它有一个名为 AsyncExec 的任务,可以使用以下目标执行。在运行ning期间,会继续执行publish的后续步骤。你只需要让命令休眠一会儿,等待publish文件夹生成,就可以修改那个publish文件夹了。

2)xxx.pubxml文件下写:

<Target Name="custom step" AfterTargets="GatherAllFilesToPublish">

    <AsyncExec Command="powershell.exe sleep 2;powershell.exe -file xxxxx"></AsyncExec>
          
</Target>

休眠时间取决于项目的大小以及发布文件夹所需的时间。

这个功能在我这边很好用。

============================================= =====

Asp Net Core项目发布

对于Asp Net Core web项目发布,

它有 AfterPublishBeforePublish 系统默认目标。 AfterPublish 目标是在将所有文件复制到发布文件夹之后,以便您也可以直接使用该系统目标。它也是 net core web publish 过程的最后一个目标。这相当于 _TransformWebConfigForAzureAuthentication Framework Publish 过程。

截图第一行和前面的内容是生成publish文件夹的过程。您可以检查将所有文件复制到发布文件夹是否在 AfterPublish 目标之前。

你可以发现对于dotnet publish,有一个真正的目标叫做AfterPublish并且它在生成运行s之后发布 文件夹。

但是,只是本系统默认的target无法覆盖,只能依赖

所以你应该这样使用:

<Target Name="custom step1" BeforeTargets="BeforePublish">

<Exec Command=""/>

</Target>

<Target Name="custom step2" AfterTargets="AfterPublish">
 
<Exec Command=""/>

</Target>

说实话,dotnet web publish相比framework web publish做了更大的优化,确实解决了这个问题,并没有做任何改进到旧 framework web publish,所以我们必须寻求其他解决方法。

结论

Winform项目发布,有AfterPublishBeforePublish目标,可以直接覆盖

Net Framework 网络发布,它没有 AfterPublishBeforePublish 目标,您应该使用其他方式。

Asp Net Core web publish,它有 AfterPublishBeforePublish 目标,它们不能被覆盖,你应该使用自定义目标这取决于他们。