Search code examples
visual-studio-2013buildmsbuildpublishmsdeploy

Visual Studio 2013 Build and Publish


I have mixed web and windows projects in VS 2013. I have a solution to build all the projects. For testing purposes I would like to automatically deploy some of the web projects into a local folder. I can do that manually, right click menu and select publish...

I have created publish profile which looks like

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>$(MSBuildThisFileDirectory)..\..\bin\PublishFolder\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

I can publish from the command line using msbuild as

msbuild C:\work\Source\AppManager\SereverManager.csproj  /p:DeployOnBuild=true /p:PublishProfile=Local 

That gives me the designed outcome as well.

What I would like to do is combine project build and publish. Which means I would like to deploy automatically every time I build the project.

I tried setting a batch file and calling msbuild from post-build event, but that causes VS to freeze, not even sure if that is the right approach. Is it possible to modify my csproj file to publish every time I build the project?


Solution

  • Yes, this is absolutely possible. Simply add the following XML to your ServerManager.csproj file.

      <PropertyGroup>
        <DeployOnBuild>true</DeployOnBuild>
        <PublishProfile>Local</PublishProfile>
      </PropertyGroup>
    

    UPDATED: 2017-02-13

    After actually testing this solution I found Yusuf was correct and the deployment only worked when I explicitly set the DeployOnBuild and PublishProfile MSBuild properties on the MSBuild.exe call.

    >"c:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild" /p:DeployOnBuild=true /p:PublishProfile=Local
    

    Setting properties in the .csproj generally works without issue. It appears the DeployOnBuild property is special. Not sure if this is a bug or intentional but setting it in the project file or a referenced targets file is overwritten somewhere in the build. Only when you define it as a global MSBuild property by setting it as a flag on the MSBuild.exe call is it respected.

    Once I discovered this I found an alternate solution that works. Pass the properties to a second MSBuild call in your project:

    <Target Name="AfterBuild">
      <MSBuild Condition="'$(DeployOnBuild)'!='true'" Projects="$(MSBuildProjectFullPath)" Properties="DeployOnBuild=true;PublishProfile=Local;BuildingInsideVisualStudio=False"/>
    </Target>
    

    Now it will automatically deploy whether you build in VS or from the commandline.