如何仅在 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 &quot;$(ProjectDir)\Copyright.ps1&quot;" />
</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 中尝试这个,当我选择发布时出现错误。错误:“元素 中的属性名称无法识别”。有什么想法吗?【参考方案2】:

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 &quot;$(ProjectDir)\InnerFolder\script.ps1&quot;" />
   </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 &quot;$(SolutionDir)Copyright.ps1&quot; &quot;$(_MSDeployDirPath_FullPath)&quot;" />
  </Target>
</Project>

【讨论】:

非常感谢理查德的回答。正如您在 Sayed 的回答中看到的那样,有一种方法可以自定义特定的发布配置文件,这更适合我的情况。 请参阅下面关于在 VS2012 中使用 .wpp.targets 的答案 @SayedIbrahimHashimi - 感谢您的提醒。您应该考虑更新文档,因为它们被记录为相等(就相关性而言)。 你能给我一个你所指的链接吗? 在文档中 .wpp.targets 部分的第一句是“您在 .wpp.targets 文件中配置的设置适用于所有发布配置文件。”你认为我们需要改变它吗?

以上是关于如何仅在 VS 2012 中的 Web 部署发布任务之前执行 PowerShell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行msbuild部署VS2012网站项目而不进行预编译?

如何发布vs2012的web站点

[转]vs2012 + web api + OData + EF + MYsql 开发及部署

如何在IIS / Azure中单独部署webconfig更改?

如何将 MVC 5 项目模板添加到 VS 2012?

如何避免仅在 Android 上的 Phonegap 应用程序黑屏?