Alan Tsai 的學習筆記


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

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


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