MsBuild : 開發 Windows 軟體的建置工具
基本 MsBuild 框架
由 XML 格式定義一個專案中有哪些要進行建置的 Target,並可以依照參數來執行建置。
基本格式如下 (可以直接複製)
- 專案預設執行目標為 build
- 於 build 工作中顯示出 Message 內容
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<Message Text="Hello Msbuild!" />
</Target>
</Project>
- 建議透過 Visual Studio 2015 中 Visual Studio Tools 的 「適用於 VS2015 的 MSBuild 命令提示字元」工具進行建置。
# 指令
# project.xml : 要進行建置的專案定義檔
C:\>MsBuild <project.xml>
# 範例如下
C:\Program Files (x86)\Microsoft Visual Studio 14.0>cd C:\Users\JianKaiWang\Desktop\
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 10:40:08。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
Build:
Hello Msbuild!
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
0 個警告
0 個錯誤
經過時間 00:00:00.11
依序建置多個任務
- 建置定義檔案如下 :
- CallTarget 定義要建置的目標
- Target 定義建置的內容
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<CallTarget Targets="Step 1"/>
<CallTarget Targets="Step 2"/>
<CallTarget Targets="Step 3"/>
</Target>
<Target Name="Step 1">
<Message Text="Step 1" />
</Target>
<Target Name="Step 2">
<Message Text="Step 2" />
</Target>
<Target Name="Step 3">
<Message Text="Step 3" />
</Target>
</Project>
- 建置結果如下
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 10:56:58。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
Step 1:
Step 1
Step 2:
Step 2
Step 3:
Step 3
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
0 個警告
0 個錯誤
經過時間 00:00:00.04
ItemGroup 與 Item 的使用
MsBuild 中透過 Item 指定專案建置中所包含的項目,ItemGroup 為 Item 的集合
ItemGroup 中可以定義 Item 名稱與內容,如下範例:
- ProjectFiles 為 item 的自定義名稱,而 item 包含要建置的內容,此處以建置 csharp 檔案為例。
- 建置時透過 @(ProjectFiles) 來輸出內容。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectFiles Include="C:\Users\JianKaiWang\Desktop\demo\demo\demo\**\*.cs" />
</ItemGroup>
<Target Name="Build">
<Message Text="@(ProjectFiles)" />
</Target>
</Project>
- 建置結果如下 :
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 11:03:14。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
Build:
C:\Users\JianKaiWang\Desktop\demo\demo\demo\obj\Debug\TemporaryGeneratedFile_
036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs;C:\Users\JianKaiWang\Desktop\demo\dem
o\demo\obj\Debug\TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.
cs;C:\Users\JianKaiWang\Desktop\demo\demo\demo\obj\Debug\TemporaryGeneratedFi
le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs;C:\Users\JianKaiWang\Desktop\demo\
demo\demo\Program.cs;C:\Users\JianKaiWang\Desktop\demo\demo\demo\Properties\A
ssemblyInfo.cs
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
0 個警告
0 個錯誤
經過時間 00:00:00.04
- 客製化顯示結果:
- 因 item 輸出內容以分號作為區隔,可以透過 @(ItemName,'Seperator') 指定分隔符號
- 例如透過 @(ItemName->'Files:%(FullPath)','%0a') 來換行顯示,%0a 表示換行符號
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectFiles Include="C:\Users\JianKaiWang\Desktop\demo\demo\demo\**\*.cs" />
</ItemGroup>
<Target Name="Build">
<Message Text="@(ProjectFiles->'Files:%(FullPath)','%0a')" />
</Target>
</Project>
- 客製化建置結果如下 :
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 11:08:43。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
Build:
Files:C:\Users\JianKaiWang\Desktop\demo\demo\demo\obj\Debug\TemporaryGenerate
dFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs
Files:C:\Users\JianKaiWang\Desktop\demo\demo\demo\obj\Debug\TemporaryGenerate
dFile_5937a670-0e60-4077-877b-f7221da3dda1.cs
Files:C:\Users\JianKaiWang\Desktop\demo\demo\demo\obj\Debug\TemporaryGenerate
dFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs
Files:C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs
Files:C:\Users\JianKaiWang\Desktop\demo\demo\demo\Properties\AssemblyInfo.cs
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
0 個警告
0 個錯誤
經過時間 00:00:00.05
PropertyGroup 與 Property 的使用
- Property 為使用者定義的屬性與値,一般而言常用來放置可變更之變數,如輸出路徑 (包含如 SourceMonitor 職行路徑) 等,此可以透過 $(PropertyName) 來呼叫結果,執行範例如下 :
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SimianPath>C:\Program Files (x86)\simian\bin\simian-2.4.0.exe</SimianPath>
</PropertyGroup>
<Target Name="Build">
<Message Text="$(SimianPath)" />
</Target>
</Project>
- 建置結果如下 :
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 11:15:47。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
Build:
"C:\Program Files (x86)\simian\bin\simian-2.4.0.exe"
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
0 個警告
0 個錯誤
經過時間 00:00:00.03
執行專案建置工作 (Task)
- Target 中的每一項執行,都是一個 task (如前述的 message),除 MsBuild 本身支援的 task 外,亦可以使用第三方軟體的 Task,如下範例的 StyleCop,並配合上述所提的 ItemGroup 與 PropertyGroup 使用進行專案建置:
<?xml version="1.0" encoding="utf-8"?>
<Project Defaulttargets="StyleCop" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask AssemblyFile="C:\Program Files (x86)\StyleCop 4.7\StyleCop.dll" TaskName="StyleCopTask" />
<ItemGroup>
<StyleCopFiles Include="C:\Users\JianKaiWang\Desktop\demo\demo\demo\**\*.cs" Exclude="C:\Users\JianKaiWang\Desktop\demo\demo\demo\**\*Test.cs" />
</ItemGroup>
<PropertyGroup>
<ProjectFullPath>C:\Users\JianKaiWang\Desktop\demo\demo</ProjectFullPath>
</PropertyGroup>
<Target Name="StyleCop">
<StyleCopTask
ProjectFullPath="$(ProjectFullPath)"
SourceFiles="@(StyleCopFiles)"
ForceFullAnalysis="true"
TreatErrorsAsWarnings="true"
OutputFile="$(ProjectFullPath)\StyleCopReport.xml"
CacheResults="true" />
</Target>
</Project>
註解 |
---|
請注意呼叫 ItemGroup 與 PropertyGroup 的變數方式不同,為 @ 與 $。 |
- 建置結果如下
C:\Users\JianKaiWang\Desktop>MsBuild example.xml
Microsoft (R) Build Engine version 14.0.24723.2
Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。
已經開始建置於 2016/8/2 上午 11:31:54。
節點 1 (預設目標) 上的專案 "C:\Users\JianKaiWang\Desktop\example.xml"。
StyleCop:
Skipping: demo - \demo\obj\Debug\TemporaryGeneratedFile_036C0B5B-1481-4323-8D
20-8F5ADCB23D92.cs
Skipping: demo - \demo\obj\Debug\TemporaryGeneratedFile_5937a670-0e60-4077-87
7b-f7221da3dda1.cs
Skipping: demo - \demo\obj\Debug\TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B5
6E-8E70B10BC5D3.cs
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(9,1): warning : SA1600 :
CSharp.Documentation : The class must have a documentation header. [C:\Users\J
ianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(11,1): warning : SA1600
: CSharp.Documentation : The method must have a documentation header. [C:\Users
\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(1,1): warning : SA1633 :
CSharp.Documentation : The file has no header, the header Xml is invalid, or t
he header is not located at the top of the file. [C:\Users\JianKaiWang\Desktop\
example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(9,1): warning : SA1400 :
CSharp.Maintainability : The class must have an access modifier. [C:\Users\Jia
nKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(11,1): warning : SA1400
: CSharp.Maintainability : The method must have an access modifier. [C:\Users\J
ianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(7,1): warning : SA1300 :
CSharp.Naming : namespace names begin with an upper-case letter: demo. [C:\Use
rs\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(1,1): warning : SA1200 :
CSharp.Ordering : All using directives must be placed inside of the namespace.
[C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(2,1): warning : SA1200 :
CSharp.Ordering : All using directives must be placed inside of the namespace.
[C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(3,1): warning : SA1200 :
CSharp.Ordering : All using directives must be placed inside of the namespace.
[C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(4,1): warning : SA1200 :
CSharp.Ordering : All using directives must be placed inside of the namespace.
[C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(5,1): warning : SA1200 :
CSharp.Ordering : All using directives must be placed inside of the namespace.
[C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Properties\AssemblyInfo.cs(1,1): wa
rning : SA1633 : CSharp.Documentation : The file has no header, the header Xml
is invalid, or the header is not located at the top of the file. [C:\Users\Jian
KaiWang\Desktop\example.xml]
12 violations encountered.
專案 "C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) 建置完成。
建置成功。
"C:\Users\JianKaiWang\Desktop\example.xml" (預設目標) (1) ->
(StyleCop 目標) ->
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(9,1): warning : SA1600
: CSharp.Documentation : The class must have a documentation header. [C:\Users
\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(11,1): warning : SA160
0 : CSharp.Documentation : The method must have a documentation header. [C:\Use
rs\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(1,1): warning : SA1633
: CSharp.Documentation : The file has no header, the header Xml is invalid, or
the header is not located at the top of the file. [C:\Users\JianKaiWang\Deskto
p\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(9,1): warning : SA1400
: CSharp.Maintainability : The class must have an access modifier. [C:\Users\J
ianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(11,1): warning : SA140
0 : CSharp.Maintainability : The method must have an access modifier. [C:\Users
\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(7,1): warning : SA1300
: CSharp.Naming : namespace names begin with an upper-case letter: demo. [C:\U
sers\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(1,1): warning : SA1200
: CSharp.Ordering : All using directives must be placed inside of the namespac
e. [C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(2,1): warning : SA1200
: CSharp.Ordering : All using directives must be placed inside of the namespac
e. [C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(3,1): warning : SA1200
: CSharp.Ordering : All using directives must be placed inside of the namespac
e. [C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(4,1): warning : SA1200
: CSharp.Ordering : All using directives must be placed inside of the namespac
e. [C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Program.cs(5,1): warning : SA1200
: CSharp.Ordering : All using directives must be placed inside of the namespac
e. [C:\Users\JianKaiWang\Desktop\example.xml]
C:\Users\JianKaiWang\Desktop\demo\demo\demo\Properties\AssemblyInfo.cs(1,1):
warning : SA1633 : CSharp.Documentation : The file has no header, the header Xm
l is invalid, or the header is not located at the top of the file. [C:\Users\Ji
anKaiWang\Desktop\example.xml]
12 個警告
0 個錯誤
經過時間 00:00:00.43