如何仅在 VS 2012 中的 Web 部署发布任务之前执行 PowerShell 脚本?
Posted
技术标签:
【中文标题】如何仅在 VS 2012 中的 Web 部署发布任务之前执行 PowerShell 脚本?【英文标题】:How to execute a PowerShell script only before a web deploy Publish task in VS 2012? 【发布时间】:2012-10-16 03:43:54 【问题描述】:目前,我使用 Visual Studio 2012 在我的 Web 项目中配置了一个构建后事件,如下所示:
这基本上调用PowerShell script 为每个.cs 文件添加版权声明。
我想做的是仅在将网络应用发布到远程服务器之前执行这个powershell脚本。这样做我不会在每次需要调试项目时遇到延迟。你知道有什么方法可以做到吗?
根据Sayed's answer,我自定义了一个特定的发布配置文件并添加了这个:
<PipelineDependsOn>
CustomBeforePublish;
$(PipelineDependsOn);
</PipelineDependsOn>
</PropertyGroup>
<Target Name="CustomBeforePublish">
<Message Text="******* CustomBeforePublish *******" Importance="high" />
<Exec Command="powershell.exe -file "$(ProjectDir)\Copyright.ps1"" />
</Target>
【问题讨论】:
抱歉,除了 pubxml 中已经存在的属性组之外,您是否添加了一个新的属性组? 【参考方案1】:这取决于您之前如何定义,但以下是一种技术。
当您使用 VS2012 创建发布配置文件时,它会在 Properties\PublishProfiles 文件夹中为您创建一个 .pubxml 文件(My Project\PublishProfiles for VB)。这些是 MSBuild 文件,您可以编辑它们以自定义发布过程。在您的情况下,您可以在发布实际发生之前将目标注入发布过程。您可以通过扩展 PipelineDependsOn 属性来做到这一点,如下所示。
<PropertyGroup>
<PipelineDependsOn>
CustomBeforePublish;
$(PipelineDependsOn);
</PipelineDependsOn>
</PropertyGroup>
<Target Name="CustomBeforePublish">
<Message Text="********************************** CustomBeforePublish ***********************************" Importance="high"/>
</Target>
仅供参考,关于 .wpp.targets 的自定义,这是我们为 VS2010 提供的唯一技术。我的建议如下;在大多数情况下自定义 .pubxml 文件,如果您想自定义给定项目的每个发布,则仅创建一个 .wpp.targets 文件。
【讨论】:
如果我想在发布之后(而不是之前)执行某事怎么办? 嗨,Sayed,我在 vs2015 中尝试这个,当我选择发布时出现错误。错误:“元素Sayed
的回答解决了这个问题。但是,我考虑过提供一个完整的答案(在 Visual Studio 2017 中测试):
<PropertyGroup>
<PipelineDependsOn>
PreBuildScript;
$(PipelineDependsOn);
</PipelineDependsOn>
</PropertyGroup>
<Target Name="PreBuildScript">
<Message Text="Executing prebuild script" Importance="high"/>
<Exec Command="powershell.exe -file "$(ProjectDir)\InnerFolder\script.ps1"" />
</Target>
注意:这将对预览和实际发布操作都执行,因此可以在实际发布之前找出发布前的错误。
【讨论】:
【参考方案3】:在您的 Web 应用程序的根目录中声明以下 ProjectName.wpp.targets
文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BeforeAddContentPathToSourceManifest>
$(BeforeAddContentPathToSourceManifest);
AddCopyright;
</BeforeAddContentPathToSourceManifest>
</PropertyGroup>
<Target Name="AddCopyright">
<!-- I recommend passing in $(_MSDeployDirPath_FullPath) to your script
as the base path to search to avoid having to perform a VCS rollback
(files are copied there before the deployment)
-->
<Exec Command="powershell.exe -file "$(SolutionDir)Copyright.ps1" "$(_MSDeployDirPath_FullPath)"" />
</Target>
</Project>
【讨论】:
非常感谢理查德的回答。正如您在 Sayed 的回答中看到的那样,有一种方法可以自定义特定的发布配置文件,这更适合我的情况。 请参阅下面关于在 VS2012 中使用 .wpp.targets 的答案 @SayedIbrahimHashimi - 感谢您的提醒。您应该考虑更新文档,因为它们被记录为相等(就相关性而言)。 你能给我一个你所指的链接吗? 在文档中 .wpp.targets 部分的第一句是“您在 .wpp.targets 文件中配置的设置适用于所有发布配置文件。”你认为我们需要改变它吗?以上是关于如何仅在 VS 2012 中的 Web 部署发布任务之前执行 PowerShell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用命令行msbuild部署VS2012网站项目而不进行预编译?
[转]vs2012 + web api + OData + EF + MYsql 开发及部署