2011-02-25 87 views
17

我一直在研究MSBuild,因为我需要自动化开发工作室的构建。我能够轻松地编写一个调用VS命令提示符并将MSBuild命令传递给它的.BAT文件。这工作得很好,有点漂亮。MSBuild - 如何从预写的命令行命令构建.NET解决方案文件(在XML任务脚本中)

这里是我的.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 

^这工作很好,但我现在需要使用的MSBuild任务的TeamCity CI。我试图写几个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构建脚本编译一个单一的解决方案用于发布模式到指定的输出目录。任何帮助?

回答

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

万分感谢。现在如果我在“MySecretApplication.sln”中有一个我想排除的项目,我该怎么做?我试过这个但它没有工作......任何想法? – D3vtr0n 2011-02-25 22:57:19

+3

您需要在解决方案中设置构建配置(右键单击解决方案节点并在Visual Studio中选择配置管理器)。您可以创建一个新配置,为其命名,并选择要构建的项目。这存储在解决方案文件中。在答案中的MSBuild文件中传递新的配置名称。您目前可能具有调试和发布配置,这些是标准名称。 – 2011-02-25 23:25:55

+0

谢谢,那很完美。 – D3vtr0n 2011-02-25 23:46:57

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> 

正如你可以看到,从布赖恩·沃克的回答的主要区别是 “配置” 的设置。在这里它被设置为“MSBuildRelease”,而不是“Release”,我从.NET IDE中定制了它。按照Brian建议的步骤(右键单击解决方案节点并在Visual Studio中选择配置管理器,添加“NEW”配置并删除/取消选中您想要排除的项目。)

我已将此上载到我的TEAMCITY服务器,并在你的帮助下使我的.NET构建过程自动化。非常感谢Brian Walker(同事德克萨斯人)......我会给你买一杯啤酒!干杯!!

0

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

尝试此处描述如果不决策意识的配置:http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_25.html

+0

本质上是同样的事情非常有趣我看到的唯一区别是用我的XML构建任务脚本,我能够使用CONFIGURATION参数来改变我的.SLN的建立秩序。我没有看到如何在Team City中使用此Auto Deploy/direct .SLN方法做到这一点? – D3vtr0n 2011-02-27 05:32:29

+0

您仍然可以通过命令行参数字段传递此信息。正如TeamCity中的描述所述:“向MSBuild.exe输入其他命令行参数”。简单! – 2011-02-27 22:20:24

+0

特洛伊,你知道这种方法是否会轻松编译Web Projects?我很难在我的脚本中构建我的ASMX文件进行发布。我需要说服自己,这是一个可行的选择,值得研究,但是如果你知道它是否有web项目限制,我很好奇吗?干杯! – D3vtr0n 2011-03-01 17:57:38

相关问题