[Cake]Cake起手式

Cake 官方

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

 

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。