发布后脚本在我发布 Web 应用程序时不运行

本文关键字:运行 应用程序 脚本 Web | 更新日期: 2023-09-27 18:35:54

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

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

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

这将遵循 MSDN 中用于替代目标的说明

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

<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

我使用构建>发布 RMA 在 VS2010 中发布,效果很好。 只是备份脚本永远不会运行。 唯一的共性是脚本本身。 我见过其他使用从源目录到目标目录的副本的示例,但我想我明白您可以通过 Exec 命令调用外部脚本? 这是我为该方法找到的示例 SO 问题

我确定我错过

了一些明显的东西,但是我进入了第二天,弄乱了一些看起来很简单的东西,所以我错过了什么?

发布后脚本在我发布 Web 应用程序时不运行

我看到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>

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

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