Visual Studio 2013构建和发布

时间:2017-01-23 21:51:54

标签: visual-studio-2013 build msbuild publish msdeploy

我在VS 2013中混合了Web和Windows项目。我有一个构建所有项目的解决方案。出于测试目的,我想自动将一些Web项目部署到本地文件夹中。我可以手动执行此操作,右键单击菜单并选择发布...

我创建的发布配置文件看起来像

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

我可以使用msbuild作为

从命令行发布
msbuild C:\work\Source\AppManager\SereverManager.csproj  /p:DeployOnBuild=true /p:PublishProfile=Local 

这也给了我设计的结果。

我想做的是组合项目构建和发布。这意味着我希望每次构建项目时都自动部署。

我尝试设置批处理文件并从构建后事件中调用msbuild,但这会导致VS冻结,甚至不确定这是否是正确的方法。是否可以修改我的csproj文件以在每次构建项目时发布?

2 个答案:

答案 0 :(得分:2)

是的,这绝对是可能的。只需将以下XML添加到ServerManager.csproj文件中即可。

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

更新:2017-02-13

在实际测试此解决方案后,我发现Yusuf是正确的,只有在MSBuild.exe调用上显式设置DeployOnBuildPublishProfile MSBuild属性时,部署才有效。

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

设置.csproj中的属性通常没有问题。看来DeployOnBuild属性很特殊。不确定这是一个bug还是故意的,但是在项目文件中设置它或者引用的目标文件会在构建中的某处被覆盖。只有当您通过将其设置为MSBuild.exe调用上的标志将其定义为全局MSBuild属性时才会受到尊重。

一旦我发现这一点,我发现了一个有效的替代解决方案。将属性传递给项目中的第二个MSBuild调用:

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

现在,无论您是在VS中还是从命令行构建,它都会自动部署。

答案 1 :(得分:0)

在@ chief7的答案的基础上,我能够在Visual Studio 2015中的MVC项目中使用它,如下所示:

<Target Name="Deploy" AfterTargets="Build">
    <MSBuild
        Condition="'$(DeployOnBuild)'!='true'"
        Projects="$(ProjectPath)"
        Targets="WebPublish"
        Properties="PublishProfile=$(AutoDeployPublishProfileName)"/>
</Target>

最初的答案是为我投掷MSB4006

  

目标依赖关系图中存在循环依赖关系,涉及目标“AfterBuild”

This answer建议更改目标名称并添加AfterTargets属性,如上所示,这有效。

对于那些需要根据配置(DebugRelease等)进行部署的人而言,@ master7有a great write-up on their website