【问题标题】:MSBuild - How to build a .NET solution file (in an XML task script) from pre-written command line commandsMSBuild - 如何从预先编写的命令行命令构建 .NET 解决方案文件(在 XML 任务脚本中)
【发布时间】:2011-07-04 10:39:24
【问题描述】:

我一直在研究 MSBuild,因为我需要自动化我的开发商店的构建。我能够轻松编写一个调用 VS 命令提示符并将我的 MSBuild 命令传递给它的 .BAT 文件。这工作得很好,有点漂亮。

这是我的 .BAT 构建文件的内容:

call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat"
cd  C:\Sandbox\Solution
msbuild MyTopSecretApplication.sln /p:OutputPath=c:\TESTMSBUILDOUTPUT /p:Configuration=Release,Platform=x86
pause

^ 这很好用,但我现在需要为 TeamCity CI 使用 MSBuild 任务。我曾尝试编写一些 MSBuild 脚本,但无法让它们正常工作。我在 .BAT 文件中使用的命令的等效构建脚本是什么?有什么想法吗?

我尝试过使用类似的东西,但没有成功(我知道这是错误的):

<?xml version="1.0"?>
<project name="Hello Build World" default="run" basedir=".">

<target name="build">
    <mkdir dir="mybin" />
    <echo>Made mybin directory!</echo>

  <csc target="exe" output="c:\TESTMSBUILDOUTPUT">
    <sources>
      <include name="MyTopSecretApplication.sln"/>
    </sources>
  </csc>
  <echo>MyTopSecretApplication.exe was built!</echo>
</target>

<target name="clean">
    <delete dir="mybin" failonerror="false"/>
</target>

<target name="run" depends="build">
  <exec program="mybin\MyTopSecretApplication.exe"/>
</target>

我只需要一个 MSBuild XML 构建脚本,它将发布模式的单个解决方案编译到指定的输出目录。有什么帮助吗?

【问题讨论】:

    标签: .net .net-4.0 msbuild build teamcity


    【解决方案1】:

    使用 MSBuild 任务构建解决方案,传递您需要的属性。

    <?xml version="1.0" encoding="utf-8"?>
    <Project
        xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
        ToolsVersion="4.0"
        DefaultTargets="Build">
    
        <PropertyGroup>
            <OutputDir>c:\TESTMSBUILDOUTPUT</OutputDir>
        </PropertyGroup>
    
        <ItemGroup>
            <ProjectToBuild Include="MySecretApplication.sln">
                <Properties>OutputPath=$(OutputDir);Configuration=Release</Properties>
            </ProjectToBuild>
        </ItemGroup>
    
        <Target Name="Build">
            <MSBuild Projects="@(ProjectToBuild)"/>
        </Target>
    
    </Project>
    

    【讨论】:

    • 谢谢一百万。现在,如果我在“MySecretApplication.sln”中有一个想要排除的项目,我该怎么做?我试过这个 但它不起作用......有什么想法吗?
    • 您需要在解决方案中设置构建配置(右键单击解决方案节点并在 Visual Studio 中选择配置管理器)。您可以创建一个新配置,为其命名,然后选择要构建的项目。这存储在解决方案文件中。在答案中的 MSBuild 文件中传递新的配置名称。您当前可能有一个标准名称的 Debug 和 Release 配置。
    • 我实际上注意到这个脚本并没有构建我的 Web 项目。我有两个 Web 项目(它们对整个应用程序非常重要),它们不再包含在我的输出中。我需要做什么才能包含我的 Web 项目?有任何想法吗?它适用于我的 .BAT 文件,但不适用于这个 MSBuild 脚本 :(
    • 我没有看到任何特殊选项或标志/标签/参数来指定 WEB 项目?这很奇怪,因为命令行版本会构建它,但 MSBuild 脚本不会。有什么想法吗?
    • 我尝试了一个我在这里拥有的网络项目,它正在运行。对于常规的 ASP.NET Web 项目,没有项目文件,项目设置保存在解决方案文件中。我运行了我针对它发布的 msbuild 脚本,它构建了网站以及支持程序集。如果您正在构建的配置设置为在 Visual Studio 的配置管理器中构建?它以类似“D:\..\WebSiteName\”的名称显示。如果您使用的是 ASP.NET MVC,那么您将拥有一个项目文件。
    【解决方案2】:

    这是我最终的 MSBuild 脚本:

    <?xml version="1.0" encoding="utf-8"?>
    

    <PropertyGroup>
        <OutputDir>C:\TESTMSBUILDOUTPUT</OutputDir>
    </PropertyGroup>
    
    <ItemGroup>
        <ProjectToBuild Include="MyTopSecretApplication.sln" >
            <Properties>OutputPath=$(OutputDir);Configuration=MSBuildRelease;Platform=x86</Properties>
        </ProjectToBuild>
    </ItemGroup>
    
    <Target Name="Build">
        <MSBuild Projects="@(ProjectToBuild)"/>
    </Target>
    

    如您所见,与 Brian Walker 回答的主要区别在于“配置”设置。这里它设置为“MSBuildRelease”而不是“Release”,这是我在 .NET IDE 中自定义的。按照 Brian 建议的步骤操作(右键单击解决方案节点并在 Visual Studio 中选择配置管理器,添加“新”配置并删除/取消选中要排除的项目。)

    我已将它上传到我的 TEAMCITY 服务器,并在您的帮助下自动化了我的 .NET 构建过程。非常感谢布赖恩·沃克(德克萨斯人)……我请你喝啤酒!!干杯!!

    【讨论】:

      【解决方案3】:

      我知道这不是您的问题的直接答案,但为什么不直接使用内置的 Visual Studio 构建运行器并从适当的 /obj 路径获取编译输出并将其保存为构建工件?如果除了针对指定的构建配置进行简单编译之外,您实际上没有做任何事情,那么拥有专用的构建文件并没有增加太多价值,使用构建工件可以让生活变得更轻松(在其他构建中使用它们,下载它们容易等)。

      如果没有意义,请尝试此处描述的配置:http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_25.html

      【讨论】:

      • 本质上是一回事。很有意思。我看到的唯一区别是,通过我的 XML 构建任务脚本,我可以使用 CONFIGURATION 参数来更改我的 .SLN 的构建顺序。我没有看到如何在 Team City 中使用这种 Auto Deploy/direct .SLN 方法做到这一点?
      • 您仍然可以通过命令行参数字段传递它。正如 TeamCity 中的描述所说“向 MSBuild.exe 输入其他命令行参数”。简单!
      • Troy,您知道这种方法是否可以轻松编译 Web 项目吗?我很难构建我的 ASMX 文件以在我的脚本中发布。我需要说服自己这是一个可行的选择,值得研究,但我很好奇你是否知道它是否有网络项目限制?干杯!
      • 抱歉有任何混淆。我实际上已经在 Team City 中使用 VS.NET 构建运行程序。我希望我能早点看到你的博客,当我把这一切都安排好并自己想出来的时候,哈哈。由于上面发布的错误,我的构建运行器失败了。当我在我的开发机器上使用 Team City 使用的完全相同的构建脚本进行本地编译时,它不会出错。我不知道为什么。
      • 我也没有在构建服务器上获得许可/安装 Visual Studio。我确实安装了 VS.NET Express,但不确定这是否会减少它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多