2016年12月17日 星期六

[iThome第8屆鐵人賽 08]建制結果問題 - 方法2 透過MSBuild的Target

在上篇了解到如果什麼都沒調整的情況下,建制出來的內容會放在一起,根本無法區分哪些內容屬於哪些專案。

也提到了.Ner 4.5能夠使用GenerateProjectSpecificOutputFolder,但是假設是.Net 4.5以下呢?

這篇我們會沿著這個思路,看看為什麼Asp .Net Mvc專案有個_PublishedWebsite,並且我們是否能夠使用這個資訊來做些處理。

sample 程式在 github devops-psake sample/chapter8


拆解WebApplication1.csproj

如果我們用editor把web專案的csproj打開,在靠近下面的部分,我們會看到幾個Target

image
2個不同的target

一般的Library專案只會有第一個target:Microsoft.CSharp.targets,而Web專案多了一個target:Microsoft.WebApplication.targets

如果把Microsoft.WebApplication.targets打開,我們會看到:有個target叫做:_CopyWebApplicationLegacy

image
找到複製的target

這個Target有很多不同檔案類型的判斷,我們可以利用這個作為我們Console複製的target

建立console用到的target

1. target檔案和資料夾名稱參數的產生

首先在BuildProject建立MSBuildTargets\ApplicationBuild.targets,這個檔案將會是我們target的位置

image
applicationBuild.targets

在來,我們先定義出要建立的資料夾名稱參數applicationoutputdirectory


    
        $(OutDir)_PublishedApplication\$(MSBuildProjectName)
        
    

2. 註冊執行的動作

再來,我們會建立當MSBuild執行的時候要執行我們複製的動作


...
 
   $(PrepareForRunDependsOn);
   _CopyApplication
  
...

這個意思是,我們會在PrepareForRunDependsOn這個事件插入我們的事件,不過首先要先把之前的執行完,然後在執行我們等一下定義的_CopyApplication這個task

3. 是定義執行的動作

接下來我們可以複製 _CopyWebApplicationLegacy所有的東西,並且做一些調整:

  1. Name的部分從 _CopyWebApplicationLegacy 改成 _CopyApplication
  2. 把路徑 WebProjectOutputDir 改成 ApplicationOutputDirectory
  3. 最後,有一組 copy,註解是 <!-- Copy content files recursively to _PublishedWebsites\app\ folder -->也拿掉


4. 把剛剛定義的target放到Console的csproj

把console的csproj打開,然後加入import target的部分在最下面:

image
用VS修改

5. 執行結果

最後整個檔案內容是:


  
  $(OutDir)_PublishedApplication\$(MSBuildProjectName)
 

 
  
   $(PrepareForRunDependsOn);
   _CopyApplication
  
 

 
    
    

    
    

    
    
    
    
    
    
    
    

    
    

    
    
    


    
    

  
image
執行結果多了一個發佈的資料夾
其實第5步的複製有些東西是可以調整更符合console專案,但是這就留給讀者去嘗試
透過這次修改MSBuild相信對於為什麼不直接用MSBuild而是用Psake有所了解,看MSBuild真的太不容易

結語

這篇算是比較快速帶過,如何利用MSBuild來做到一些我們想要擴充的動作,在非.Net 4.5之前,這個是我們唯一的做法,不過相較於上一篇提到的方式,這個方法實在太繁瑣了。

在接下來的篇章,我會持續使用上篇的做法,並且我們開始要進入到執行測試的階段,不過在進入測試之前,還有一個問題要先解決,那就是當建制失敗應該會怎麼樣。


沒有留言 :

張貼留言