MSBuild - 如何从预先编写的命令行命令构建.NET解决方案文件(在XML任务脚本中)

时间:2011-02-25 16:39:14

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

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

以下是我的.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构建脚本,它将Release模式的单个解决方案编译为指定的输出目录。有什么帮助吗?

3 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分: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中选择Configuration Manager,添加“NEW”配置并删除/取消选中要排除的项目。)

我已将此文件上传到我的TEAMCITY服务器,并在您的帮助下自动完成了我的.NET构建过程。非常感谢Brian Walker(德克萨斯人)......我会给你买啤酒!! CHEERS !!

答案 2 :(得分:0)

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

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