发布Web应用程序时,AfterPublish脚本不会运行。

11

我有一个ASP.NET Web应用程序,当我进行更改或修复错误时,会将其发布到我们的网站上。我们希望自动将项目文件备份保存到我们的服务器(与SVN签入分开),因此我编写了一个批处理文件,将整个项目从本地驱动器复制到服务器。批处理文件在单独运行时能够正常工作,因此这不是问题所在。如果这是一个问题,批处理文件不在项目路径中。

然后,我在我的.csproj文件中添加了以下行,就在关闭的</project>标记之前:

<Target Name="AfterPublish" >
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
</Target>

这遵循了MSDN中关于重写目标的说明

我还尝试了此Stack Overflow问题中提到的方法。其如下所示:

<Target Name="BackUpRMAToIDrive" AfterTargets="MSDeployPublish" >
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
</Target>

那也不行。

为了完整起见,这是批处理文件,它非常简单,但如果有人感兴趣,我可以解释一下开关:

xcopy C:\deg\ASP.NET\OnlineRMA_SinglePage\*.* /cherkyDi I:\common\AppDevBranch\Service\rma

我使用 Build > Publish RMA 在 VS2010 中发布,这很好用。只是备份脚本从未运行过。唯一的共同点就是脚本本身。我看到其他示例使用了从源目录复制到目标目录的方法,但我认为可以通过 Exec 命令直接调用外部脚本?以下是我找到的使用该方法的 SO 问题示例

我确定我错过了显而易见的东西,但我已经浪费了第二天时间纠结于一个看起来相当简单的问题,那我错过了什么?


大家解决了吗?我也遇到了类似的问题。 - Terry
不好意思,我从来没有这样做过。上周我只是对这段代码进行了一些更改,而且必须手动完成所有操作。如果你弄清楚了,请确保在这里发布你的步骤! - delliottg
2个回答

11

我看到一位微软开发人员的评论,称发布到“文件系统”不会调用MSDeployPublish目标。您可以在此处查看。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/60b196e9-28e1-4d9d-b464-d57e42353754/vs2012-afterpublish-for-web-application?forum=msbuild

http://sedodream.com/PermaLink,guid,b352f04a-2449-4cbb-8125-7acdef9552e1.aspx

深入研究*.targets文件,我可以在AfterTargets属性中放置几个目标,以完成在发布后运行,当发布复制到临时obj输出文件夹时。 我从未找到一个在复制到定义在发布配置文件中的实际文件夹之后运行的目标。

这是我认为您需要的:

  <Target Name="BackUpRMAToIDrive" AfterTargets="CopyAllFilesToSingleFolderForPackage">
    <Exec Command="C:\deg\bat\backupRMA.cmd" />
  </Target>

我不确定您正在备份什么-原始源还是发布的源。在进行此执行时,如果您需要路径到“已发布文件”,则可以通过$(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder)向脚本传递参数。这将类似于c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp


我不认为这个情况有改变,你最终是否能够找到一个在复制到发布配置文件中定义的实际文件夹后成功运行的呢? - Maslow
@Maslow - 不需要。我只是想在发布时将包含附加元信息(例如发布原因、任务修复等)的文件放入最终输出目录中,并使其可用。所以我只需将它放在$(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder)中,当VS完成发布时,它会将我的文件与所有其他文件一起移动。你想做什么? - Terry
我通过文件结构和本地复制存储库的方式解决了这个问题 - 在自述文件中有描述 - https://github.com/ImaginaryDevelopment/MyBlueBlazor - Maslow

3
当您手动运行cmd文件时,脚本肯定会以管理员权限或足够的权限运行,以成功复制文件到目标位置(在这种情况下为I:单元)。
从Visual Studio执行脚本的线程可能具有非常受限制的权限,出于安全原因。
您最好的选择是从powershell运行脚本,并将以下参数传递给它:
-ExecutionPolicy Unrestricted
您的XML将如下所示:
<Target Name="CustomPostPublishActions" AfterTargets="MSDeployPublish">
  <PropertyGroup>
    <PowerShellExe Condition=" '$(PowerShellExe)'=='' "> 
      %WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe
    </PowerShellExe>
    <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">
      C:\deg\bat\backupRMA.cmd
    </ScriptLocation>
  </PropertyGroup>
  <Exec Command="$(PowerShellExe) -NonInteractive -executionpolicy Unrestricted 
                 -command &quot;&amp; invoke-command -scriptblock { 
                          &amp;&apos;$(ScriptLocation)&apos; 
                          }
                          &quot;"/>  
</Target>

您还可以查看此MSDN链接以获取类似的命令:

http://www.asp.net/web-forms/tutorials/deployment/advanced-enterprise-web-deployment/running-windows-powershell-scripts-from-msbuild-project-files


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接