msbuild 語法 MSBuild入門(續)

2021-10-17 06:37:30 字數 4164 閱讀 9018

msbuild基本概念(續)

msbuild特殊字元:msbuild保留的一些字元,以及xml中的特殊字元處理。

msbuild條件: condition特性,作用類似於c#的if。

msbuild屬性: 使用環境變數、保留屬性、全域性屬性。

msbuild任務: itask介面、usingtask[自定義任務]、continueonerror。

msbuild目標: 初始目標、預設目標、目標依賴項。

import元素: 匯入專案檔案到當前專案檔案。

msbuild特殊字元

一些字元在msbuild中代表著特殊的上下文含義,如下:

msbuild的特殊字元[%引用元資料]、[$引用屬性]、[@引用項]、['條件或其他表示式]、[;列表分隔符]、[?檔名萬用字元]、[*檔名萬用字元];

xml的保留字元:、&、"、'

針對msbuild的特殊字元轉義需要用[%xx]這種方式,xx代表字元的ascii十六進製制值([%=%25][$=%24][@=%40]['=%27][;=%3b][?=%3f][*=%2a])。針對xml保留字元則使用《這種方式。 一般用到這些特殊字元的情況不多,見到時能知道是轉義就可以了。

msbuild條件

條件在*.*proj專案檔案中非常常見,用condition特性來表示乙個布林表示式,類似於if條件,幾乎所有的元素都可以具有conditon特性。乙個簡單的例子如下:

1 <?xml version="1.0" encoding="utf-8"?>

2 3

4 5

6 7 debug

8 x86

9 10

11 12

13 14

15 16

17 18

19 20

還有一些常用的表示式如!=、!、and、or等。

msbuild屬性

上篇介紹到可以用$可以引用自定義的屬性,除此之外亦可以引用系統的環境變數,如$(path),以及 msbuild保留屬性(msdn)。

屬性除了可以在專案檔案中宣告是賦值外,在msbuild命令列也允許設定屬性的值(語法:/p:propertyname=value)。稱作全域性屬性,這類屬性會重寫在專案檔案中設定的屬性值,保留屬性除外的任何屬性都可被這種方式覆蓋其原值。 以上面示例為基礎:[msbuild condition.xml /p:platform=x64],則最終輸出結果就為debug|x64了。

屬性還有一種叫做任務發出屬性,在上篇用到了,由output元素的propertyname特性指定了屬性名,這類屬性不像一般的宣告式屬性那樣賦值,而是動態得到的值。是在專案檔案中很常見的用法。

msbuild項

項大都是用來引入檔案用的,而檔案會有一些附加資訊,比如版本,語言等,而這些附加資訊在專案檔案中是以項的子元素的出現的,稱為項的元資料。元資料是鍵/值的形式儲存的,宣告方式和屬性相同。

1 2

3 4

5 6 zh-cn

7 8

除了自定義的一些元資料外,系統還提供一些隱式存在的元資料,即不用宣告即可使用,具體可參見

項轉換允許把乙個項的列表與另乙個列表一一變換。比如下面的例子:

1 >

5 6

7 '%(filename).vb')"/>

8 9

10 11

12 13

14 15

msbuild任務

從上篇中我們對任務的認識是它是乙個原子操作,用來執行某一項邏輯處理,但是xml格式的專案檔案是沒有這個處理能力的,所以這些任務都是對映到.net類庫中的一些類,由這些類來處理操作中的邏輯。具體來說都是實現itask介面的類,itask介面位於microsoft.build.framework命名空間。當然我們也可以實現自己的任務類,直接實現itask介面或者繼承自task(此抽象類實現了itask介面的部分功能,可簡化自定義任務類的編寫,留出乙個execute抽象方法供子類重寫自己的任務邏輯)。然後通過usingtask元素對映到出乙個任務元素。我就繼承task寫乙個簡單的示例:

1 需編譯為dll

2 usingsystem;3 usingmicrosoft.build.utilities;4 usingmicrosoft.build.framework;5

6 ///

7 ///繼承task,任務邏輯是處理加法8 ///

9 public classaddtwonumbertask : task10 16 ///

17 ///定義另乙個加數18 ///

19 public string number2 20 public override boolexecute()21 26 ///

27 ///定義乙個輸出引數,使用output特性修飾該屬性28 ///

29 [output]30 public string sum 31 }

然後編寫如下專案檔案,放於addtwonumbertask.cs同目錄下:

1 2 <?xml version="1.0" encoding="utf-8"?>

3 4

5 6 library

7 8

9 10

11 12

13 14

15 16

17 18

19 references="@(reference->'$(msbuildbinpath)\%(identity).dll')"

20 targettype="$(outputtype)">

21 22

23 用msbuild編譯buildaddtaskdll.csproj專案檔案。得到addtwonumbertask.dll程式集。再編寫乙個專案檔案usingtask如下:

如果仔細看addtwonumbertask.cs檔案就會發現

//如果number1或者2不是數字,則此任務就會拋異常了

this.sum = (int32.parse(this.number1) + int32.parse(this.number2)).tostring();

那麼如果在這裡加乙個continueonerror=「true」,則表示會忽略掉邏輯處理中的錯誤,繼續執行,否則會終止執行後續任務。如果任務有輸出引數的話,output元素總是作為任務的子元素出現,作為乙個中間橋梁把任務的輸出傳輸到屬性或者項中。

msbuild目標

project根元素代表者乙個專案檔案,上面的例子我都會寫乙個defaulttargets特性來指定該專案檔案要執行的預設目標是哪乙個。其實此特性是可選的,也是可以用分號分割寫多個的,執行順序依據書寫順序來判定,也可通過msbuild命令列引數來傳遞:

msbuild /target:build1;build2

除此之外,project元素還有乙個可選特性initialtargets,也支援多個目標。如果這兩個特性都沒有,則msbuild先執行它遇到的第乙個target。target有乙個dependsontargets特性表示當前目標依賴另乙個目標,效果就是dependsontargets特性指定的目標先於當前目標執行。這繞來繞去好多先後順序關係,寫乙個示例看看吧。

1 <?xml version="1.0" encoding="utf-8"?>

2 3

4 5

6 toolsversion="4.0"xmlns="">

7 8

9 10

11 12

13 14

15 16

17 18

19 20

21 22

23 24

25 26

27 import元素

專案模版產生的*.*proj專案檔案大量的使用這個元素,用來匯入可重用的專案檔案,其中最常見的乙個應該是這個吧,如果你用c#開發的話。

msbuildtoolspath或者是msbuildbinpath,project特性指定要匯入的專案檔案。import元素像是乙個佔位元素,msbuild在執行到此時會用*.targets替換掉此元素,就像本來就宣告在這裡一樣,所以和*.targets檔案有關的所有保留屬性會被重置。 import元素對匯入檔案的副檔名無要求,檔案是正確的專案檔案就行,但一般約定為*.targets。

總結和備註

備註:針對專案檔案中所指的「特性」是表示乙個xml元素的「屬性」。由於屬性在msbuild中有特殊含義,則msdn文件一律把專案檔案中的xml屬性稱作是特性,比如message任務的text特性。如有錯誤之處,歡迎指正!

msbuild 語法 MSBuild 命令引數

build a visual studio project or solution using msbuild command line arguments 常用命令行引數 詳解 msbuild version 配置的 msbuild.exe msbuild build file 是需要發布專案的專...

MSBuild使用初步

了解一下msbuild工程檔案的基本結構,作為練習,用它編譯乙個用到qt庫的c 控制台程式 乙個簡單的例子 file hello.cs using system class csharptest 如果直接用命令列的話,可以直接這麼編譯 csc out hello cs.exe hello.cs 可是...

MSBuild 常用引數

一般的 msbuild 在編譯的時候都會新增很多引數,用法如下 進入對應編譯的 sln 或 csproj 檔案所在的資料夾,執行下面命名 msbuild如果在資料夾裡面存在多個不同的 sln 檔案等,在 msbuild 後面新增對應的檔案 msbuild xx.sln此外新增的引數寫在 msbuil...