2016年12月6日 星期二

[iThome第8屆鐵人賽 05]準備建制專案環境的Task

在上篇對於psake有些了解以後,我們開始把所學的東西用於如何搭配方便建制專案。

在這篇,我們會定義當專案建制的時候,我們的資料夾結構和先把那些資料夾環境準備好

建制結果的資料夾結構

當我們專案開始建制的時候,要有地方能夠放置一些暫存檔案和最終編譯結果,我們將會使用以下結構:

image
build結構
  • .build - 是最上層的部分,目前習慣好像.開頭的資料夾都是暫時性的內容,例如visual studio的設定。所以我們會一樣的概念來儲存我們的建制結果
  • temp - 當建制完成的時候,結果會儲存在這個temp裡面
  • testResult - 這個是儲存我們測試執行完成的結果
  • testCoverage - 這個用來儲存我們測試的範圍度
  • artifact - 這邊儲存的是最後的結果。例如,zip出來的發佈內容,或者nuget package

準備Init task

parameter

要準備這個建制結果的資料夾,我們會增加一個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方法又變的很乾淨了。

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的動作


沒有留言 :

張貼留言