在上篇對於psake有些瞭解以後,我們開始把所學的東西用於如何搭配方便建制專案。
在這篇,我們會定義當專案建制的時候,我們的資料夾結構和先把那些資料夾環境準備好
同步發表於我的部落格:http://blog.alantsai.net/2016/12/devopsSeries-buildDirectoryTask.html (部落格的格式會漂亮一些,ithome不支援html好不方便)
當我們專案開始建制的時候,要有地方能夠放置一些暫存檔案和最終編譯結果,我們將會使用以下結構:
要準備這個建制結果的資料夾,我們會增加一個task專門做這個事情。
不過我們要先有個位置記錄.build的位置 - 這樣未來如果要改位置非常的方便
由於我們的.build位置會需要在properties動態在設定,因此沒有辦法直接使用properties的參數 - 在psake裡面還有一個叫做parameter的參數適合做這個事情。
parameter 和 properties的差異在於,properties的順序在parameter後面,換句話說,在properties裡面可以取得到parameter的值。
所以我們的build.ps1會變成:
....
Invoke-psake -buildFile .\default.ps1 -taskList Test `
-parameters @{
"solutionFile" = (Get-ChildItem("..\*.sln")).FullName |
Sort-Object $_ | select -Last 1
}`
-properties @{
"testMsg"="測試訊息"
}
在default.ps1會增加一個Init的task,同時properties裡面就會有用到這個參數:
Properties{
...
$solutionDirectory = (Get-Item $solutionFile).DirectoryName
$buildDirectory = "$solutionDirectory\.build"
}
task Init -depends Clean -description "初始化建制所需要的設定"{
Write-Host "建立建制結果的資料夾 $buildDirectory"
New-Item $buildDirectory -ItemType Directory | Out-Null
}
task Compile -depends Clean, Init -description "編譯程式碼" {
Write-Host $compileMsg
}
上面我們用了parameter的solutionFile來建制我們的.build資料夾同solution檔案層級
然後我們增加一個init的task來建立最上層的資料夾,並且把init作為compile的dependency
建制資料夾的邏輯區分開來
接下來我們就在properties裡面持續增加我們其他幾個資料夾路徑的參數,然後一個一個建立出來
Properties{
...
$solutionDirectory = (Get-Item $solutionFile).DirectoryName
$buildDirectory = "$solutionDirectory\.build"
$buildTempDirectory = "$buildDirectory\temp"
$buildTestResultDirectory = "$buildDirectory\testResult"
$buildTestCoverageDirectory = "$buildDirectory\testCoverage"
$buildArtifactDirectory = "$buildDirectory\artifact"
}
task Init -depends Clean -description "初始化建制所需要的設定"{
Write-Host "建立建制結果的資料夾 $buildDirectory"
New-Item $buildDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的Temp資料夾 $buildTempDirectory"
New-Item $buildTempDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的TestResult資料夾 $buildTestResultDirectory"
New-Item $buildTestResultDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的TestCoverage資料夾 $buildTestCoverageDirectory"
New-Item $buildTestCoverageDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的Artifact資料夾 $buildArtifactDirectory"
New-Item $buildArtifactDirectory -ItemType Directory | Out-Null
}
這邊會發現,雖然建制都沒有什麼問題,但是Init這個task變的有點長。同程式一樣,我們可以把同樣類型的功能放到一個方法一樣,我們可以用一樣概念來重構我們的內容。
function InitDirectory{
Write-Host "建立建制結果的資料夾 $buildDirectory"
New-Item $buildDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的Temp資料夾 $buildTempDirectory"
New-Item $buildTempDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的TestResult資料夾 $buildTestResultDirectory"
New-Item $buildTestResultDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的TestCoverage資料夾 $buildTestCoverageDirectory"
New-Item $buildTestCoverageDirectory -ItemType Directory | Out-Null
Write-Host "建立建制結果裡面的Artifact資料夾 $buildArtifactDirectory"
New-Item $buildArtifactDirectory -ItemType Directory | Out-Null
}
task Init -depends Clean -description "初始化建制所需要的設定"{
InitDirectory
}
這個時候我們的Init方法又變的很乾淨了。
到目前為止,在建立build使用的資料夾完成了,不過這個時候會發現,第二次執行的時候,資料夾已經存在了,所以會執行不了
所以在clean的task裡面,我們要針對這個部分吧上次結果給清理掉
task Clean -description "刪除上次編譯遺留下來的內容"{
if(Test-Path $buildDirectory){
Write-Host "清除上次編譯的結果 $buildDirectory"
Remove-Item $buildDirectory -Recurse -Force
}
Write-Host $cleanMsg
}
可以看到我們先測試一下這個資料夾有沒有存在,如果有存在,我們就把這個資料夾下面所有內容都刪掉
在這篇我們瞭解到了,怎麼實際開始定義Task並且用作於之後我們build會儲存的位置。
這個準備好了之後,下面我們就實際開始做build的動作