在上一篇了解了如何建制一個專案之後,和我們之後要使用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基本資訊
- psake github repo:https://github.com/psake/psake
- nuget:https://www.nuget.org/packages/psake/
- nuget 安裝指令:Install-Package psake
- 說明文件:http://psake.readthedocs.io/en/latest/
- chocolatey:https://chocolatey.org/packages/psake
- chocolatey指令:choco install 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:
第二步 - 產生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
快速找到)
Powershell Interactive Windows打開之後,先注意一下你的位置,記得要先CD進去有sake專案的位置下,然後執行下面語法(建議各位手動輸入,因為會發現很方便有intellisense)
- Import-Module ..\packages\psake.4.6.0\tools\psake.psm1 - 這個動作是吧psake加入進來
- Invoke-psake Test - 執行我們Test的這個Task
介紹psake的task寫法
在這段會介紹剛剛我們準備的時候一些psake相關的資訊,並且在往下做一些延伸。
檔案default.ps1
首先是檔名的部分。剛剛應該會注意到,執行psake的時候並沒有給他要執行那個檔案,但是他自動找到了。原因是預設他會找default.ps1
這個檔案。
因此在任何一個psake檔案default.ps1都是進入點。
task的定義
基本上 task 最少(或者最常見) 會定義幾個事情:
- Task的名稱 - 也就是 task 後面的字
- Task之間的關聯 - 用
-depends
關鍵字 - 可以定義在執行這個Task之前需要先執行什麼Task。如果有多個Task,用逗點(,)區隔。這邊注意一件事情,depend的task 最多只會執行一次 - 所以,以我們的例子,Test和Compile都相依clean,但是clean只執行了一次。(當然,其實Test不需要寫相依Clean,,因為Compile已經有相依了。 - 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="測試訊息"}
這邊注意到在外面呼叫的時候不需要錢字符($)
在執行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"="測試訊息"
}
結語
希望透過這篇,對於psake如何定義和使用有了基本的概念。我們將會在接下來使用這個專案建制我們的build script。
在下篇,我們將會開始進入建制的部分,psake如何利用現有MSBuild有的資源作出我們要的建制環境。