2011-02-25 86 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

相關問題