2016年12月4日 星期日

[iThome第8屆鐵人賽 04]開始了解如何使用psake

在上一篇了解了如何建制一個專案之後,和我們之後要使用psake作為build tool,在這篇我們將會看到底怎麼開始使用psake,和建立出我們之後會一直使用的專案。

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

開始使用psake

psake是一個powershell的module,因此,除了psake的module檔案需要下載之外,在Windows不需要在做什麼其他安裝和設定。

安裝psake到電腦裡面其實很簡單,只需要到psake的github repo下載下來,然後在powershell裡面呼叫Import-Module .\psake.psm1,那麼psake就好了。

當然,還需要這個下載動作好麻煩,從專案角度來說,難道我需要要求所有開發者都需要自己做這件事情嗎?那不是很麻煩

非常好的是,psake有提供nuget版本,因此我們可以用nuget來把psake鍵入到專案裡面(如果想裝在電腦裡,可以透過chocolatey來方便安裝)

psake基本資訊

了解基本資訊之後,我們就開始建立測試環境

準備好測試專案

我們就先建立一個Visual Studio的專案。以前,nuget是可以安裝在solution層級,但是後來改掉了,但是問題不大,我們可以建立一個C# Library用來記錄這個dependency。

接下來psake相關內容我們寫的其實都是powershell的語法 - 看個人使用,可以用powershell的ise來寫,或者用Visual Studio。

既然大家都是開發者,建議用Visual Studio - 可以安裝一個套件PowerShell Tools for Visual Studio, 未來debug什麼都可以直接在Visual studio做。甚至想寫單元測試都可以直接在上面跑。

powershell有個好處是,如果到時候到build server有問題,可以用上面的powershell ise來直接debug。

第一步 - 建立C# Library Project和安裝psake nuget

先建立一個C# Library的Project,把預設的Class1.cs刪掉,然後用nuget安裝psake:

image
專案準備

第二步 - 產生default.ps1檔案

建立一個檔案,然後把檔名取做default.ps1。(可以在新建檔案選class檔案,然後把檔名改掉):

然後我們貼上一下內容在default.ps1裡面:

task Test -depends Compile, Clean { 
 Write-Host "Executed Test !"
}

task Compile -depends Clean { 
 Write-Host "Executed Compile !"
}

task Clean { 
 Write-Host "Executed Clean !"
}

第三步 - 執行我們定義的Task

開啟VS 裡面的 Powershell Interactive Windows(可以透過搜索右上角的Quick Launch快速找到)

image
Quick Launch

Powershell Interactive Windows打開之後,先注意一下你的位置,記得要先CD進去有sake專案的位置下,然後執行下面語法(建議各位手動輸入,因為會發現很方便有intellisense)

image
輸入方法有intellisense
  1. Import-Module ..\packages\psake.4.6.0\tools\psake.psm1 - 這個動作是吧psake加入進來
  2. Invoke-psake Test - 執行我們Test的這個Task

執行下去之後,會看到我們三個Task都執行了,並且我們寫的動作也執行了。 image
可以看到執行了什麼還有總共執行時間 - 注意執行的當下資料夾是不是在buildProject

介紹psake的task寫法

在這段會介紹剛剛我們準備的時候一些psake相關的資訊,並且在往下做一些延伸。

檔案default.ps1

首先是檔名的部分。剛剛應該會注意到,執行psake的時候並沒有給他要執行那個檔案,但是他自動找到了。原因是預設他會找default.ps1這個檔案。

因此在任何一個psake檔案default.ps1都是進入點。

task的定義

基本上 task 最少(或者最常見) 會定義幾個事情:

  1. Task的名稱 - 也就是 task 後面的字
  2. Task之間的關聯 - 用 -depends關鍵字 - 可以定義在執行這個Task之前需要先執行什麼Task。如果有多個Task,用逗點(,)區隔。這邊注意一件事情,depend的task 最多只會執行一次 - 所以,以我們的例子,Test和Compile都相依clean,但是clean只執行了一次。(當然,其實Test不需要寫相依Clean,,因為Compile已經有相依了。
  3. Task要執行什麼 - 這個內容是放在{}裡面。

task其他參數

預設Task

預設Task的定義 - 舉例來說,剛剛執行的時候要輸入Task名稱,但是有一個特殊的task,他的名字叫做 default,這個task只能有-depends 參數,並且沒有執行內容。這個就會是當invoke-psake沒有給task名稱所會執行的。舉例來說:task default -depends Test - 就會定義在 不給task名稱的情況下,預設要執行Test這個task

增加Task的描述

-description 參數 - 有時候光看Task名稱還不確定會做什麼,所以可以用參數-description給一個詳細說明。這個時候能夠在透過 Invoke-Psake -docs來看到整體的task。

Task參數化

目前我們在每個task的動作只是寫到console。假設今天我想寫到console的字可以自訂,就會使用到properties,舉例來說,我想定義每一個執行的時候顯示的訊息: 我就會先定義一個properties:

Properties{
 $testMsg = "Executed Test !"
 $compileMsg = "Executed Compile !"
 $cleanMsg = "Executed Clean !"
}
  
  

然後對應的Write-Host改成用這些參數

當我要改變這些值的時候,在Invoke-Psake的時候就加上properties就好:Invoke-psake -properties @{testMsg="測試訊息"}

image
參數替換

這邊注意到在外面呼叫的時候不需要錢字符($)

在執行Task之前先檢查是否有提供某個參數

如果有些參數會影響到我們執行,可以直接在task裡面用-requiredVariables,然後variable名稱即可。有多個就用逗點分割。

這樣可以減少我們需要在執行中做檢測

到目前為止有多介紹了一些常用的task定義方式 - 在接下來,如果有些有在額外用到會在用到的時候說明。

增加方便執行psake的build.ps1檔案

在這篇結束以前,我們會發現到每一次執行psake都要先import-module,在執行其實是非常繁瑣,而且如果給另外一個工程師不懂powershell,可能光import module就卡死他了。

所以我們會在增加所謂的bootstrap script - 就是我們只要執行那個檔案,而那個檔案會把該做的都設定好。幫我們防呆。

所以,我會建立另外一個檔案,我叫做build.ps1,用作於每一次建制的時候執行。

裡面有的內容如下:

  # 如果psake module有存在,先把他反註解
if (Get-Module -ListAvailable -Name psake) {
 Remove-Module psake
} 

# 找到psake module並且註冊
$psakeModulePath = (Get-ChildItem("..\packages\psake*\tools\psake.psm1")).FullName |
     Sort-Object $_ | select -Last 1

if(Test-Path $psakeModulePath){
 Import-Module $psakeModulePath
}else{
 Write-Host "找不到psake module,請確認好nuget package有restore完成"
 return
}

# 執行psake
Invoke-psake -buildFile .\default.ps1 -taskList Test `
    -properties @{
    "testMsg"="測試訊息"
    }
  
image
執行變得簡單,只要呼叫build.ps1

結語

希望透過這篇,對於psake如何定義和使用有了基本的概念。我們將會在接下來使用這個專案建制我們的build script。

在下篇,我們將會開始進入建制的部分,psake如何利用現有MSBuild有的資源作出我們要的建制環境。


沒有留言 :

張貼留言