2016年12月17日 星期六

[iThome第8屆鐵人賽 07]建制結果問題 - 說明 和 處理方法 1

上篇我們提到了用psake來建制一個asp .net mvc的專案,並且修正了psake執行時候呈現的內容,在這篇,我們將進一步延伸來看一下,buid結束產生的內容是什麼和 加入另外兩種常見的.Net專案:

  1. Console Project
  2. Library Project


sample 程式在 github devops-psake sample/chapter7

Build結果有什麼

執行完build之後,我們會看到,在.build\temp下面有一堆檔案。

image
一堆怪怪的檔案

如果只熟悉用Visual Studio來建制的話,會覺得奇怪,怎麼有這麼多奇奇怪怪的檔案跑出來,並且網站那些css,javascript怎麼都不見了?

在往下看,會看到有一個.\build\temp\_PublishedWebsites\WebApplication1,這個看起來就和我們所了解的網站專案比較有關係。

image
_publishedWebsites\WebApplication1

目前來說,我們可以得出一個結論,也就是建制出來的東西雖然結果是在我們指定的資料夾裡面,但是所有東西都在同一個層級

加入Library和Console專案

假設我們在加入兩個常見的專案類型,Library和Console。

image
多了兩個project

這個時候我們在build一次,在看看我們的結果,這個時候會發現,所有東西都堆在了一起。

如果結果都堆在一起,我們要怎麼區分什麼是什麼?因為最後我們要發佈或者把建制結果打包,如果區分不了如何能夠做這個事情?

解決方法 1 - .Net 4.5 以上的專案 - GenerateProjectSpecificOutputFolder

在MSbuild有個參數叫做GenerateProjectSpecificOutputFolder,這個參數可以讓建制的時候,結果還是依照solution專案來放。

所以我們可以再:default.ps1,調整建制MSBuild的參數:

task Compile -depends Clean, Init -description "編譯程式碼" `
    -requiredVariables solutionFile, buildConfiguration, buildTarget, buildTempDirectory `
{ 
 Write-Host "開始建制檔案:$solutionFile"

 $buildParam = "Configuration=$buildConfiguration" +
     ";Platform=$buildTarget" + 
     ";OutDir=$buildTempDirectory"
 
 $buildParam = $buildParam + ";GenerateProjectSpecificOutputFolder=true"

 msbuild $solutionFile "/p:$buildParam"
}
  

這個時候在看看發佈出來的結果,可以很清楚看到資料夾有做了區分。

image
建制結果有區分專案

解決方法1的缺點

雖然說解決方法1很簡單就能夠實現,但是他有個小缺陷 - .Net 4.5 以上的專案才能夠支援 - 雖然比較少寫4.5以下的專案,但是至少有這個缺陷。

加上這個系列也想介紹一些MSBuild的基本概念,因此我們想象另外一個思路。

解決方案 2 - 使用Asp.Net Mvc的概念產生出 _PublishedXXX

另外一個思路是,既然Asp.Net Mvc會把它包好,是否可以用同樣概念去對Library還有Console程式的結果包在特定的資料夾下面?

要了解這個,就需要了解到為什麼只有Asp .Net Mvc的專案才會產生帶有 _PbulishedWebsite的資料夾,而這個答案就在MSBuild建制Asp .Net Mvc的方式不同有關。也就是下篇介紹的內容。

結語

在這篇了解到其實建制出來的結果都是混在一起的,沒有辦法區分那個專案的結果在那邊。而這個問題將會影響到我們之後不管執行測試也好,還是要打包結果,都會造成不便利。

這個問題的一種解決方式是透過MSBUild的一個參數 - 但是這個只能夠用在.net 4.5以上的專案。

所以在下篇,我們會了解,到底asp .net mvc專案是如何做到產生在不同資料夾,並且我們如何使用這個概念


沒有留言 :

張貼留言