AfterPublish script doesn't run when I publish a web app
Asked Answered
H

2

11

I've got an ASP.NET web app that I publish to our website when I make changes or fix bugs. We want to automatically save a backup of the project files to our server (separate from the SVN check in), so I wrote a batch file to copy the entire project from my local drive to the server. The batch file works properly when run stand alone, so that's not the problem. The batch file is not in the path of the project if that's a concern.

Then I added these lines to my .csproj file right above the closing </project> tag:

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

This follows the instructions in MSDN for overriding a target.

I have also tried the method outlined in this SO question. Which looked like this:

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

That doesn't work either.

For completeness, here's the batch file, it's pretty simple, but I can explain the switches if anyone's interested:

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

I publish in VS2010 using Build > Publish RMA, which works fine. It's just the backup script never runs. The only commonality is the script itself. I've seen other examples that use a copy from source dir to destination dir, but I thought I understood that you could just call an external script through the Exec command? Here's the example SO question I found for that method.

I'm certain I'm missing something obvious, but I'm onto my second day of messing around with something that seems pretty straight forward, so what am I missing?

Handwoven answered 18/10, 2013 at 17:55 Comment(2)
Every figure this out? Having similar problem.Druci
No, sorry, never did. I just made some changes to this code last week and had to do everything by hand. If you figure it out, make sure you post your steps here!Handwoven
D
11

I saw a comment from a MS developer stating that publishing that goes to the 'File System' does not call MSDeployPublish target. You can see that here.

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

Digging around in the *.targets files there were a few targets I could place in the AfterTargets attribute that accomplished running after the publish had copied to the temporary obj output folder. I could never find one that ran after copying to the actual folder defined in the publish profile.

Here is what I think you would need:

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

I'm not sure what you are backing up though - the original source or the published source. At the time of this Exec, if you need the path to the 'published files', you can pass in a parameter to your script via $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder). This would be something like c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

Druci answered 22/2, 2016 at 15:6 Comment(3)
I don't suppose this has changed, and you were eventually able to find one that would run after the copying to the actual folder defined in the publish profile?Sayyid
@Sayyid - No. I guess I didn't need it. I was simply trying to put a file with additional meta information gathered at time of publish (i.e. a publish reason, task fixed, etc.) and have it available in the final output directory. So I was able to simply put it in $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder) and when VS finished the publish, it moved my file along with all the other files. What are you trying to do?Druci
I worked around it with file structuring and duplicating the repo locally - described in the readme - github.com/ImaginaryDevelopment/MyBlueBlazorSayyid
L
3

When you run the cmd file manually, the script surely runs with administrator privileges, or enough privileges to succesfully copy the files to the destination (in the I: unit in this case).

The thread that executes the script from Visual Studio probably has very restricted privileges, due to security reasons.

Your best bet, is run the script from powershell, passing the following argument to it:

-ExecutionPolicy Unrestricted

Your XML will look like this:

<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>

You can also check this MSDN link for similar commands:

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

Lail answered 31/8, 2014 at 3:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.