Alan Tsai 的學習筆記


學而不思則罔,思而不學則殆,不思不學則“網貸” 為現任微軟最有價值專家 (MVP)、微軟認證講師 (MCT) 、Blogger、Youtuber:記錄軟體開發的點點滴滴 著重於微軟技術、C#、ASP .NET、Azure、DevOps、Docker、AI、Chatbot、Data Science

[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之前,這個是我們唯一的做法,不過相較於上一篇提到的方式,這個方法實在太繁瑣了。

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


如果文章對您有幫助,就請我喝杯飲料吧
街口支付QR Code
街口支付QR Code
台灣 Pay QR Code
台灣 Pay QR Code
Line Pay 一卡通 QR Code
Line Pay 一卡通 QR Code
街口支付QR Code
支付寶QR Code
街口支付QR Code
微信支付QR Code
comments powered by Disqus