Cake
Cake是一種跨平台且使用 C# DSL 的方式,讓會寫C#的人可以用寫C#的方式來自動編譯專案,自動跑測試,自動複製檔案、自動安裝NuGet packages等等的動作。
瞇之聲:對我這種不太會寫Dos指令的人真是一大福音阿
Step 1:
新增一個MVC專案(包含單元測試)
Step 2:
打開PowerShell,將路徑指到該專案根目錄,執行以下指令
Invoke-WebRequest http://cakebuild.net/bootstrapper/windows -OutFile build.ps1
之後會看到專案跟目錄多一個build.ps1檔案,這就是我們的執行檔
Step 3:
根目錄新增一個build.cake script檔案(cakebuild會預設跑此檔名的script)
Step 4:
開啟build.cake寫script
執行腳本如下:
清除建置檔案 -> 執行建置 -> 執行單元測試
///////////////////////////////////////////////////////////////////////////////
// GLOBAL VARIABLES
///////////////////////////////////////////////////////////////////////////////
var solutions = GetFiles("./**/*.sln");
var solutionPaths = solutions.Select(solution => solution.GetDirectory());
///////////////////////////////////////////////////////////////////////////////
// TASK DEFINITIONS
///////////////////////////////////////////////////////////////////////////////
// 清除建置檔案
Task("Clean")
.Description("Cleans all directories that are used during the build process.")
.Does(() =>
{
// Clean solution directories.
foreach(var path in solutionPaths)
{
Information("Cleaning {0}", path);
CleanDirectories(path + "/**/bin/Release");
CleanDirectories(path + "/**/obj/Release");
}
});
// 建置
Task("Build")
.Description("Builds all the different parts of the project.")
.IsDependentOn("Clean")
.Does(() =>
{
// Build all solutions.
foreach(var solution in solutions)
{
Information("Building {0}", solution);
MSBuild(solution, settings =>
settings.SetPlatformTarget(PlatformTarget.MSIL)
.WithProperty("TreatWarningsAsErrors","true")
.WithTarget("Build")
.SetConfiguration("Release"));
}
});
// 執行單元測試
Task("UnitTest")
.Description("Runing Test")
.IsDependentOn("Build")
.Does(() =>
{
MSTest("./**/bin/Release/*.Tests.dll");
});
///////////////////////////////////////////////////////////////////////////////
// TARGETS
///////////////////////////////////////////////////////////////////////////////
Task("Default")
.Description("This is the default task which will be ran if no specific target is passed in.")
.IsDependentOn("UnitTest");
///////////////////////////////////////////////////////////////////////////////
// EXECUTION
///////////////////////////////////////////////////////////////////////////////
RunTarget("Default");
Step 5:
在PowerShell輸入./build.ps1,執行Cake script
Step 6 :
執行成功的話,會看到PowerShell顯示所有Task的執行過程,執行結束後會顯示執行結果,如下:
後記:
使用./build.ps1執行的時候,如果專案沒有Cake,則會自動從NuGet下載必要工具,所以可以看到根目錄會新增一個tools資料夾,裡面放的都是Cake必要工具。 反之如果專案有Cake,則就不會再次下載Cake了。
執行./build.ps1跑Task的時候,私底下是執行Cake.exe幫你做事情的,所以當專案有Cake.exe的時候,要跑自動化指令,也可改由直接呼叫Cake.exe的方式執行.\tools\Cake\Cake.exe build.cake
不過筆者這邊還是建議使用./build.ps1的方式執行Script,因為使用./build.ps1會讀取build.ps1裡面的自訂參數,我們可以用設定參數的方式,來幫助我們寫Script。
build.ps1裡面的參數設定區塊:
build.ps1裡面的執行指令區塊,在這邊build.ps1幫我們把上面設定的參數,組成指令碼送出,所以如果有新增自訂參數的話,要在這邊組上新增的自訂參數
反之,如果不使用./build.ps1來跑Script,採用Cake.exe執行的話,每次指令都要加入我Script內使用的參數。
.\tools\Cake\Cake.exe build.cake -target="default"
心得:
看來以後可以用C#來自動化囉XD
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。