发布Web应用程序时,AfterPublish脚本无法运行

时间:2013-10-18 17:55:20

标签: c# asp.net batch-file msbuild publishing

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

然后我将这些行添加到结束</project>标记正上方的.csproj文件中:

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

这符合MSDN for overriding a target中的说明。

我也尝试了this SO question中概述的方法。看起来像这样:

<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&gt;在VS2010中发布发布RMA,效果很好。这只是备份脚本永远不会运行。唯一的共性是脚本本身。我见过其他使用源dir到目标目录的副本的例子,但我想我明白你可以通过Exec命令调用外部脚本吗? Here's the example SO question I found for that method

我确定我错过了一些显而易见的东西,但是我第二天就搞好了一些看似很直接的东西,所以我错过了什么?

2 个答案:

答案 0 :(得分:9)

我看到一位MS开发人员的评论说明发布到'文件系统'并不会调用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>

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

答案 1 :(得分:2)

当您手动运行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