我們平時寫完程式以後,在Visual Studio中右擊build,我們的程式就編譯完了。那麼點擊build之後到底發生了什麼事情?如果沒有Visual Studio我們該如何進行編譯?這就是MSBuild提供的功能,下面將以一些例子來一步步的說明它的用法。
情境:
有一個.cs檔案,想用MSBuild將它編譯成一個exe檔案.
using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
}
}
} |
實施:
1.建立Project檔案:
用任何的文字編輯器建立一個.proj檔案(在這個例子中是MyApp.proj), 在檔案裡加入如下的內容:
<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> </Project> |
這是一個根節點,後面的步驟中,將在它的下面添加一些子節點。
2.添加項目屬性。
一個項目有很多屬性,比如項目名稱。現在就為這個項目添加一個名稱:
<Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup>
<appname>MyApp</appname>
</PropertyGroup>
</Project> |
從上面的代碼可以看到,屬性都放在PropertyGroup節點中。
appname這個屬性其實類似於一個變數,在檔案的其他的地方可以通過@(appname)來引用它。
所以放在PropertyGroup裡面的節點都相當於一些全域變數,以供在檔案的其他地方使用。
3.添加Item.
下面將要編譯的檔案添加到配置裡面去:
<Project DefaultTargets = "Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Set the application name as a property --> <PropertyGroup> <appname>MyApp</appname> </PropertyGroup> <ItemGroup>
<CSFile Include = "MyClass.cs"/>
</ItemGroup>
</Project> |
可以看到,Item放在ItemGroup節點裡。CSFile也類似於一個變數,在檔案的其他的地方可以通過@(CSFile)來引用它。
4.添加Target.
Target指的是要編譯任務的集合,是Task的容器。
<Project DefaultTargets = "Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Set the application name as a property --> <PropertyGroup> <appname>HelloWorldCS</appname> </PropertyGroup> <ItemGroup> <CSFile Include = "MyClass.cs"/> </ItemGroup> <Target Name="Compile"></Target>
</Project> |
5.添加Task.
Task是Target的子節點,用來定義一個個具體的編譯任務。
<Project DefaultTargets = "Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Set the application name as a property --> <PropertyGroup> <appname>HelloWorldCS</appname> </PropertyGroup> <ItemGroup> <CSFile Include = "MyClass.cs"/> </ItemGroup> <Target Name="Compile"> <CSC Sources = "@(CSFile)"></CSC>
</Target> </Project> |
上面的代碼中,CSC是MSBuild保留字,它會調用csc.exe來進行編譯。
@()裡面用來放Item的集合名字。在這裡放的是第3步中定義的CSFile項。如果在當前Target中有多個CSFile節點,都會被這個CSC 任務處理。
6.添加Task output
Task output指的是一個具體任務的輸出設定。
<Project DefaultTargets = "Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Set the application name as a property --> <PropertyGroup> <appname>HelloWorldCS</appname> </PropertyGroup> <ItemGroup> <CSFile Include = "MyClass.cs"/> </ItemGroup> <Target Name="Compile"> <CSC Sources = "@(CSFile)" OutputAssembly = "$(appname).exe"> <Output TaskParameter="OutputAssembly"
ItemName="MyClass"/>
</CSC> </Target> </Project> |
上面代碼中的TaskParameter指定了輸出的檔案名稱,它用的是CSC節點中定義的OutputAssembly屬性的值。
ItemName指定這個Item的名字,在其他地方可以通過@()文法引用這個Item.
7. 添加訊息
如果希望在編譯的過程中,輸出一些訊息來指示編譯的進度。可以對一個Target添加Message.
<Project DefaultTargets = "Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" > <!-- Set the application name as a property --> <PropertyGroup> <appname>MyApp</appname> </PropertyGroup> <ItemGroup> <CSFile Include = "MyClass.cs"/> </ItemGroup> <Target Name="Compile"> <CSC Sources = "@(CSFile)" OutputAssembly = "$(appname).exe"> <Output TaskParameter="OutputAssembly" ItemName="MyClass"/> </CSC> <Message Text="The output file is @(MyClass)"/>
</Target> </Project> |
可以看到,這段代碼引用了第6步中設定的ItemName
執行:
- 將MyApp.proj和MyClass.cs放在一個目錄中。
- 開啟命令列,執行MSBuild("C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe" MyApp.proj),執行結果如下: