從零開始構建MSBuild C 專案檔案

2021-09-20 01:50:03 字數 3476 閱讀 4727

本文參考自msdn的一篇文章,從零開始建立msbuild c#專案檔案。

首先開啟msbuild命令提示符,然後切換到你想要建立專案的資料夾,例如我的文件或者桌面。然後,輸入md helloworld建立乙個名為helloworld的資料夾。然後輸入cd helloworld切換到這個資料夾。為簡便起見,下面所說的命令提示符,都是指這裡的msbuild命令提示符。

using system;

class helloworld

}

將檔案儲存之後,就可以在命令提示符中使用c#編譯器工具csc編譯該檔案了。

csc helloworld.cs
然後就可以執行生成的helloworld.exe來檢視編譯生成的檔案了。

helloworld.exe
應該可以在命令提示符中看到程式的輸出。然後,刪除生成的exe,準備下一步。

下面來簡單解釋一下。

csproj專案檔案是乙個xml檔案,根節點是project節點,可以包括若干個itemgroup節點和target節點。itemgroup節點是乙個容器,用來包括若干個項元素。例如這裡就包括了乙個項元素compile,,包括了helloworld.cs檔案。這裡還可以使用萬用字元。

target元素是專案構建的目標,每個檔案可以有多個target,執行不同的任務。這裡,名為build的target就包括了csc任務來編譯乙個檔案,使用source屬性來指定要編譯的檔案。另外還有一些任務,會在下面說明。

這裡還有一種語法@(compile),這裡會引用上面定義的項。在這裡就是引用上面定義的helloworld.cs檔案。如果定義了多個項,target在執行的時候會以類似foreach的形式迭代執行每乙個項。

有了專案檔案,就可以使用msbuild來執行專案的生成了,/t表示執行名為build的target。

msbuild helloworld.csproj /t:build
檢視一下是否生成了helloworld.exe,然後將其刪除,準備下一步。

在project開始標籤之後新增乙個屬性組節點:

msbuildsample

bin\

每個專案檔案可以包括若干個propertygroup節點,其中可以包括若干個屬性節點,每乙個節點定義乙個屬性,可以在專案檔案中引用。這裡就包括了assemblyname和outputpath兩個屬性。之後就可以通過$(屬性名)的語法來使用了。

在csc節點前插入乙個節點:

然後再csc節點中增加乙個outputassembly屬性:

這裡增加了乙個建立資料夾的任務,建立的資料夾名字由上面的屬性組定義。幾乎每個任務都可以新增乙個condition屬性,指定什麼條件下執行該任務。這裡是在輸出目錄不存在的情況下才執行該任務,建立目錄。除此之外,還有其他很多任務,例如複製檔案、刪除檔案等等,詳細情況可以檢視msbuild任務參考。另外還有乙個名字叫做msbuild community tasks的開源專案,包含了其他一些任務,如果有需求的可以參考一下。

另外微軟建議我們在定義目錄屬性的時候,最好將目錄後面的反斜槓\定義到屬性中,而不是加在引用之後。例如上面的就比下面的更好:

bin\

outputassembly=="$(outputpath)$(assemblyname).exe" />

bin

outputassembly=="$(outputpath)\$(assemblyname).exe" />

現在專案檔案應該類似這樣:

msbuildsample

bin\

再次執行一下構建命令,檢視一下程式出否在輸出目錄中生成。

msbuild helloworld.csproj /t:build
在構建過程中可以指定多個構建目標,可以指定乙個目標呼叫其他目標,還可以指定預設的構建目標。

在build目標之後新增兩個新目標:

這兩個構建目標很簡單,clean目標會刪除生成的exe檔案。rebuild目標會執行clean和build兩個目標。

在project節點中新增乙個新屬性defaulttarget,就可以指定乙個預設目標。如果執行msbuild命令的時候沒有使用/t指定target,就會自動執行預設的目標。

執行一下msbuild helloworld.csproj /p:assemblyname=greetings,測試一下。這裡通過/p引數傳入指定的引數名,這會覆蓋專案檔案中指定的檔名。如果不指定引數名的話就會使用在專案中已經定義的引數。然後執行msbuild helloworld.csproj /t:clean /p:assemblyname=greetings**/p:assemblyname=greetings,刪除已經生成的檔案。

在名為build的target中新增如下屬性:

inputs="@(compile)" outputs="$(outputpath)$(assemblyname).exe"
inputs屬性指定該目標依賴的輸入檔案,在這裡由上面的compile項所定義。outputs指定專案的輸出檔案。指定這兩個屬性之後,msbuild就會在執行此目標的時候檢查輸入和輸出檔案。如果輸入檔案相對於輸出檔案都是最新的,那麼msbuild就會跳過構建過程。如果有部分檔案已經修改,msbuild就會只對這部分檔案執行構建目標。

msbuild依據csproj專案檔案來進行構建。csproj檔案中可以有多種節點。

itemgroup節點是專案組,可以有多個子節點, 用來包含要處理的乙個或多個檔案。每個子節點都必須有include屬性指定要包含什麼檔案,還有乙個可選的exclude節點指定排除什麼檔案。定義itemgroup之後,就可以利用@(節點名)來引用item了。

propertygroup節點是屬性組,可以有多個節點,用來包含專案構建過程中使用到的屬性。定義了屬性之後,可以使用$(屬性名)語法來訪問。

target是構建目標,是msbuild的執行目標,每個target下面可以包含多個任務,還可以引用其他的target構成乙個執行鏈。微軟和c#社群定義了很多任務,可以分別在其msbuild任務參考和msbuild community tasks中找到。

最後,我在github上新建了乙個專案msbuildexample,演練了一下上面的概念。這個專案新增了乙個afterbuild目標,在release狀態下構建成功之後,將生成的可執行檔案重新命名成自定義名稱,然後和第三方庫以及乙個配置檔案打包生成zip壓縮包。有興趣的同學可以看一下。

react native系列 從零開始構建

從零開始構建第一步,當然是從hello world開始,第一課我們沒什麼 都不寫,只用生成的 來打包apk。為什麼一開始就要學會打包,因為如果連打包都不會,以後做好了也沒用。學會了打包,才能讓我們有動力繼續下去,現在網上到處也有資料,本文也是在查了資料之後進行的。因為安卓的apk都需要簽名,所以我們...

從零開始構建服務註冊 filter

filter是服務註冊框架為服務端架構的主要實現位置。首先,我們提供web fragment.xml catlogfilterfilter name com.umetrip.common.filter.unityaccessfilterfilter class filter catlogfilter...

Django 從零開始

方法1 pip install django 1.6.5 測試是否安裝成功 python import django 1,6,5,final 0 django 使用了 python 標準的 distutils 安裝法,在 linux 平台可能包括如下步驟 tar xzvf django tar.gz...