Post-发布配置文件 XML 下的发布脚本,以便在实际发布之前调用 IIS
Post-Publish Script under Publish Profile XML for IIS getting called before actual publish
我正在尝试弄清楚 Pre-Publish
和 Post-Publish
脚本如何与来自 Visual Studio 2019
的 IIS
的 MSBuild
部署一起工作。
下面是我的 customprofile.pubxml
文件:
当我发布输出时 windows 打印消息但是 Post-Publish 也发生在实际发布之前。
不确定这里发生了什么。
实际上、AfterPublish
和 BeforePublish
用于 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
,因为网络发布确实不包含 AfterPublish 和 BeforePublish 目标,您应该在它们上指定一个 dependenttarget。
解决方案
使用这些:
<Target Name="BeforePulish" BeforeTargets="GatherAllFilesToPublish">
.....
</Target>
<Target Name="AfterPublish" AfterTargets="GatherAllFilesToPublish">
.......
</Target>
============================================= ==
更新 1
很抱歉没有详细列出有关该问题的所有提示。
问题应该分为两种情况:
============================================= ==
网络框架项目
对于Net Framework web 项目发布,
实际上在Net Framework
项目中,没有明显的系统默认目标BeforePublish
和AfterPublish
。 GatherAllFilesToPublish是核心的发布步骤,也是发布过程中执行的最后一个目标。
但是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项目发布,
它有 AfterPublish
和 BeforePublish
系统默认目标。 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项目发布,有AfterPublish
和BeforePublish
目标,可以直接覆盖
Net Framework 网络发布,它没有 AfterPublish
和 BeforePublish
目标,您应该使用其他方式。
Asp Net Core web publish,它有 AfterPublish
和 BeforePublish
目标,它们不能被覆盖,你应该使用自定义目标这取决于他们。
我正在尝试弄清楚 Pre-Publish
和 Post-Publish
脚本如何与来自 Visual Studio 2019
的 IIS
的 MSBuild
部署一起工作。
下面是我的 customprofile.pubxml
文件:
不确定这里发生了什么。
实际上、AfterPublish
和 BeforePublish
用于 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
,因为网络发布确实不包含 AfterPublish 和 BeforePublish 目标,您应该在它们上指定一个 dependenttarget。
解决方案
使用这些:
<Target Name="BeforePulish" BeforeTargets="GatherAllFilesToPublish">
.....
</Target>
<Target Name="AfterPublish" AfterTargets="GatherAllFilesToPublish">
.......
</Target>
============================================= ==
更新 1
很抱歉没有详细列出有关该问题的所有提示。
问题应该分为两种情况:
============================================= ==
网络框架项目
对于Net Framework web 项目发布,
实际上在Net Framework
项目中,没有明显的系统默认目标BeforePublish
和AfterPublish
。 GatherAllFilesToPublish是核心的发布步骤,也是发布过程中执行的最后一个目标。
但是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项目发布,
它有 AfterPublish
和 BeforePublish
系统默认目标。 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项目发布,有AfterPublish
和BeforePublish
目标,可以直接覆盖
Net Framework 网络发布,它没有 AfterPublish
和 BeforePublish
目标,您应该使用其他方式。
Asp Net Core web publish,它有 AfterPublish
和 BeforePublish
目标,它们不能被覆盖,你应该使用自定义目标这取决于他们。