【问题标题】:Visual Studio 2013 Build and PublishVisual Studio 2013 构建和发布
【发布时间】:2017-01-23 21:51:53
【问题描述】:

我在 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 as 从命令行发布

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

这也给了我设计的结果。

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,这是绝对可能的。只需将以下 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 属性很特殊。不确定这是错误还是故意的,但在项目文件中设置它或引用的目标文件在构建中的某处被覆盖。只有当您通过在 MSBuild.exe 调用上将其设置为标志来将其定义为全局 MSBuild 属性时,它才会受到尊重。

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

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

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

    【讨论】:

    • 谢谢@chief7。我尝试了你的建议,但它没有让我得到我想要的东西。我什至尝试在 PropertyGroup 中添加 DeployOnBuild 和 PublishProfile 以进行发布配置
    • 我已经这样做了很多次,所以我知道它有效。您正在构建发布配置吗?
    • 是的,我正在构建发布配置。我确信这是可行的,只是不确定我错过了什么。我在原始消息中创建了指向 csproj 文件副本的链接。
    • 我通过让我的项目使用 MSBuild 而不是 VS 来解决这个问题。您的解决方案可以处理这两种情况,而且更加优雅。
    • 很高兴它有帮助。感谢分享!
    【解决方案2】:

    基于 @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 等)进行部署的人来说,@chief7 有 a great write-up on their website

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多