Alan Tsai 的學習筆記


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

[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有的資源作出我們要的建制環境。


如果文章對您有幫助,就請我喝杯飲料吧
街口支付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