在上篇了解到如果什麼都沒調整的情況下,建制出來的內容會放在一起,根本無法區分哪些內容屬於哪些專案。
也提到了.Ner 4.5能夠使用GenerateProjectSpecificOutputFolder
,但是假設是.Net 4.5以下呢?
這篇我們會沿著這個思路,看看為什麼Asp .Net Mvc專案有個_PublishedWebsite,並且我們是否能夠使用這個資訊來做些處理。
拆解WebApplication1.csproj
如果我們用editor把web專案的csproj打開,在靠近下面的部分,我們會看到幾個Target
一般的Library專案只會有第一個target:Microsoft.CSharp.targets
,而Web專案多了一個target:Microsoft.WebApplication.targets
如果把Microsoft.WebApplication.targets
打開,我們會看到:有個target叫做:_CopyWebApplicationLegacy
這個Target有很多不同檔案類型的判斷,我們可以利用這個作為我們Console複製的target
建立console用到的target
1. target檔案和資料夾名稱參數的產生
首先在BuildProject
建立MSBuildTargets\ApplicationBuild.targets
,這個檔案將會是我們target的位置
在來,我們先定義出要建立的資料夾名稱參數applicationoutputdirectory
:
$(OutDir)_PublishedApplication\$(MSBuildProjectName)
2. 註冊執行的動作
再來,我們會建立當MSBuild執行的時候要執行我們複製的動作
...
$(PrepareForRunDependsOn);
_CopyApplication
...
這個意思是,我們會在PrepareForRunDependsOn
這個事件插入我們的事件,不過首先要先把之前的執行完,然後在執行我們等一下定義的_CopyApplication
這個task
3. 是定義執行的動作
接下來我們可以複製 _CopyWebApplicationLegacy
所有的東西,並且做一些調整:
- Name的部分從 _CopyWebApplicationLegacy 改成 _CopyApplication
- 把路徑 WebProjectOutputDir 改成 ApplicationOutputDirectory
- 最後,有一組 copy,註解是
<!-- Copy content files recursively to _PublishedWebsites\app\ folder -->
也拿掉
4. 把剛剛定義的target放到Console的csproj
把console的csproj打開,然後加入import target的部分在最下面:
5. 執行結果
最後整個檔案內容是:
$(OutDir)_PublishedApplication\$(MSBuildProjectName)
$(PrepareForRunDependsOn);
_CopyApplication
結語
這篇算是比較快速帶過,如何利用MSBuild來做到一些我們想要擴充的動作,在非.Net 4.5之前,這個是我們唯一的做法,不過相較於上一篇提到的方式,這個方法實在太繁瑣了。
在接下來的篇章,我會持續使用上篇的做法,並且我們開始要進入到執行測試的階段,不過在進入測試之前,還有一個問題要先解決,那就是當建制失敗應該會怎麼樣。