iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 6
0
DevOps

從.Net工程師的角度來看DevOps - 到底能夠幫助什麼系列 第 6

[iThome第8屆鐵人賽 06]開始建制一個Asp .Net Mvc專案

  • 分享至 

  • xImage
  •  

經過了幾天的理論介紹,我們開始要進入建制專案的部分。

我們會先拿一個Asp .net Mvc的網站作為第一個要建制的專案,所以我們會先建立出來,然後在使用MSBuild帶來的幫助,幫我們快速建立專案

這次的建制我們都是focus在.net Framework的部分,或許.net core會有所不同,但是概念是一樣。

(之後下面提到的code都可以從這邊看到內容:github repo,這篇會是tag sample/chapter6)

同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-buildMvcWebProject.html (部落格的格式會漂亮一些,ithome不支援html好不方便)

MSBuild和Psake的關係

在我們往下之前,有一個關係要在說明一下。我們使用psake並不是說要完全放棄MSBuild,反而是兩個結合在一起得到兩者的好處。

首先,我們知道VS其實有很多不同類型的專案,而這些不同類型的專案在建制過程呼叫方式都完全不太一樣。因此,微軟提供了很多不同project的msbuild target(同等於task的概念)來處理 怎麼建制這些專案和要copy那些檔案。

因此,我們不會重複造車輪,而是直接使用MSBuild所帶來的便利。

不過這個時候會好奇,那當初不就直接用MSBuild就好?

原因非常簡單,要擴充MSBuild非常麻煩。需要用C#才有辦法寫,然後又要處理一堆xml。

反過來看psake,非常簡單,只要定義一個powershell script就好。

所以,接下來我們會看到MSBuild被執行就沒什麼好奇怪。

準備程式用於做建制測試

我們需要先把環境準備好方便接下來的測試。

首先我們先建立一個Asp .net Mvc的專案,先看看有web專案情況會如何。

我們會建立一個asp .net mvc的專案,並且包含預設的Test專案

選擇asp .net web application

選擇Mvc,然後勾選unit test

開始建制我們的專案

基本上在建制專案的時候,有3個重要參數,說明一下:

  1. 建制模式 - 一般我們都會設定要用Debug還是Release(預設模式)
  2. 目標的platform - 一般有三個值,x64、x86和Any Cpu
  3. 建制結果的位置 - 要把建制結果放在那裡,以我們來說就是 .build\temp 裡面

1 和 2 其實 在VS裡面也可以設定,不過一般來說不怎麼調整就是

VS設定建制模式和目標platform的位置
有了這三個部分之後,我們就可以來調整我們Compile的Task

首先,剛剛提到的三個參數,第1和第2要增加,而第3我們已經有了。和其他參數一樣,我們會把這個加在properties裡面,這樣才有可能可以把值覆蓋。

Properties{
...
 $buildConfiguration = "Release"
 $buildTarget = "Any CPU"
}

再來的會就是我們實際的Compile task:

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

 msbuild $solutionFile "/p:Configuration=$buildConfiguration;Platform=$buildTarget;OutDir=$buildTempDirectory"
}

這邊使用到了msbuild做實際的編譯,然後用到了requiredVariables去做參數的驗證。

這個時候我們就可以去執行build.ps1,會發現一切正常,但是有幾個小問題。

建製成功

修正Compile時候出現的幾個小問題

MSBuild使用的.Net版本錯了

首先從build的日誌裡面可以看到,我們使用的MSBuild版本是4.6,但是我們的.Net Framework卻是4.0,但是實際上我們的project是用4.5.2寫的。如果用到4.5.2才有的功能, 很可能導致編譯錯誤。

build到了4.0

這個很好解決,在Invoke-psake有個參數叫做framework,用這個可以設定build的target framework。

所以在build.ps1

Invoke-psake -buildFile .\default.ps1 -taskList Test `
    -framework "4.5.2" `
    -parameters @{
    "solutionFile" = (Get-ChildItem("..\*.sln")).FullName |
     Sort-Object $_ | select -Last 1
    }`
    -properties @{
    "testMsg"="測試訊息"
    }

Console看不出哪段是psake在執行
msbuild的內容比較多,造成看不太清楚那段屬於task記錄執行。不過psake有提供一個叫做FormatTaskName,能夠定義Task執行的時候顯示的內容。

在default.ps1可以增加以下方法

FormatTaskName ("`r`n`r`n" + ("-"*25) + "[{0}]" + ("-"*25))

看起來區分比較明顯

結語

在這篇我們開始把psake和msbuild做了結合,並且把一個mvc網站建立了出來。

在下篇,我們會看看被compile出來的結果,和加入console和library專案,看看建制結果是否有不同。


上一篇
[iThome第8屆鐵人賽 05]準備建制專案環境的Task
下一篇
再戰江湖
系列文
從.Net工程師的角度來看DevOps - 到底能夠幫助什麼7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
superpucy
iT邦新手 3 級 ‧ 2016-12-06 23:24:08

/images/emoticon/emoticon31.gif/images/emoticon/emoticon31.gif/images/emoticon/emoticon31.gif

Alan Tsai iT邦新手 2 級 ‧ 2016-12-07 07:39:06 檢舉

/images/emoticon/emoticon06.gif

我要留言

立即登入留言