24

目前,我使用 Visual Studio 2012 在我的 Web 项目中配置了一个构建后事件,如下所示:

在此处输入图像描述

这基本上调用了一个PowerShell 脚本来为每个 .cs 文件添加版权声明。

我想做的是仅在将 Web 应用程序发布到远程服务器之前执行这个 powershell 脚本。这样做我不会在每次需要调试项目时遇到延迟。你知道有什么方法可以做到这一点吗?


根据赛义德的回答,我定制了一个特定的发布配置文件并添加了这个:

<PipelineDependsOn>
  CustomBeforePublish;
  $(PipelineDependsOn);
</PipelineDependsOn>
</PropertyGroup>
<Target Name="CustomBeforePublish">
<Message Text="******* CustomBeforePublish *******" Importance="high" />
<Exec Command="powershell.exe -file &quot;$(ProjectDir)\Copyright.ps1&quot;" />
</Target>
4

3 回答 3

24

这取决于您之前如何定义,但以下是一种技术。

当您使用 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 文件。

于 2012-10-16T17:45:30.550 回答
7

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>

注意:这将对预览和实际发布操作都执行,因此可以在实际发布之前找出发布前的错误。

于 2018-07-27T09:58:59.673 回答
4

ProjectName.wpp.targets在 Web 应用程序的根目录中声明以下文件:

<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>
于 2012-10-16T05:54:28.450 回答