在上篇對於psake有些了解以後,我們開始把所學的東西用於如何搭配方便建制專案。
在這篇,我們會定義當專案建制的時候,我們的資料夾結構和先把那些資料夾環境準備好
建制結果的資料夾結構
當我們專案開始建制的時候,要有地方能夠放置一些暫存檔案和最終編譯結果,我們將會使用以下結構:
- .build - 是最上層的部分,目前習慣好像.開頭的資料夾都是暫時性的內容,例如visual studio的設定。所以我們會一樣的概念來儲存我們的建制結果
- temp - 當建制完成的時候,結果會儲存在這個temp裡面
- testResult - 這個是儲存我們測試執行完成的結果
- testCoverage - 這個用來儲存我們測試的範圍度
- artifact - 這邊儲存的是最後的結果。例如,zip出來的發佈內容,或者nuget package
準備Init task
parameter
要準備這個建制結果的資料夾,我們會增加一個task專門做這個事情。
不過我們要先有個位置記錄.build的位置 - 這樣未來如果要改位置非常的方便
由於我們的.build位置會需要在properties動態在設定,因此沒有辦法直接使用properties的參數 - 在psake裡面還有一個叫做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方法又變的很乾淨了。
Clean Task 調整
到目前為止,在建立build使用的資料夾完成了,不過這個時候會發現,第二次執行的時候,資料夾已經存在了,所以會執行不了
所以在clean的task裡面,我們要針對這個部分吧上次結果給清理掉
task Clean -description "刪除上次編譯遺留下來的內容"{ if(Test-Path $buildDirectory){ Write-Host "清除上次編譯的結果 $buildDirectory" Remove-Item $buildDirectory -Recurse -Force } Write-Host $cleanMsg }
可以看到我們先測試一下這個資料夾有沒有存在,如果有存在,我們就把這個資料夾下面所有內容都刪掉
結語
在這篇我們了解到了,怎麼實際開始定義Task並且用作於之後我們build會儲存的位置。
這個準備好了之後,下面我們就實際開始做build的動作
沒有留言 :
張貼留言