我們平時寫完程序以后,在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),執行結果如下: