[Cake]撰寫Task語法說明

Task Fundamentals

繼上篇介紹的[Cake起手式]後,相信讀者對Cake有一點概念了,接下來就是補足寫Cake Script時會用到的語法。

在這邊筆者採用Visual Studio Code來寫Cake Script,所以如果讀者也是用Visual Studio Code來寫的話,建議可事先安裝Syntax Highlighting/Snippets

 

Tasks

建立任務

Task("First Task")    
    .Description("First Task描述說明,目只是給程式師看的說明,並不影響其他作業")
    .Does(() =>
{
    //執行要做的事情
    Information("Hello World");
});

 

 

Running targets

執行已建立好的Task

RunTarget一定要放在所有Task的後面
Task("First Task")    
    .Description("First Task描述說明,目只是給程式師看的說明,並不影響其他作業")
    .Does(() =>
{
    //執行要做的事情
    Information("Hello World");
});

RunTarget("First Task");
採用Argument的方式執行RunTarget

至build.ps1設定$Target參數

取得參數執行RunTarget

var target = Argument("target");

Task("First Task")
    .Description("First Task描述說明,目只是給程式師看的說明,並不影響其他作業")
    .Does(() =>
{
    //執行要做的事情
    Information("Hello World");
});

RunTarget(target);

 

 

Dependencies

相依執行,可指定Task執行順序

Task("First Task")
    .Description("First Task描述說明,目只是給程式師看的說明,並不影響其他作業")
    .Does(() =>
{
    //執行要做的事情
    Information("This is First Task");
});

Task("Second Task")
    .Description("當執行完任務First Task後,接著執行Second Task")
    .IsDependentOn("First Task")
    .Does(() =>
{
    //執行要做的事情
    Information("This is Second Task");
});


RunTarget("Second Task");

 

Criteria

根據設定條件是否執行Task

bool isExecution = Argument<bool>("Configuration");

Task("First Task")
    .Description("First Task描述說明,目只是給程式師看的說明,並不影響其他作業")
    .WithCriteria(isExecution)
    //.WithCriteria(() => isExecution) 兩種寫法都可以
    .Does(() =>
{
    //執行要做的事情
    Information("This is First Task");
});

Task("Second Task")
    .Description("當執行完任務First Task後,接著執行Second Task")
    .WithCriteria(() => true)
    .IsDependentOn("First Task")
    .Does(() =>
{
    //執行要做的事情
    Information("This is Second Task");
});


RunTarget("Second Task");

 

Error handling

當Task執行過程中有發生任何Exception,之後的任務都會被終止,如以下範例:

Task("Task")    
    .Does(() =>
{    
    throw new Exception("Throw Error Code : 2014");  
});

Task("TestAfterError")
    .IsDependentOn("Task")    
    .Does(() =>
{    
      Information("After Error Task");
});

RunTarget("TestAfterError");

Reporting errors

如果想在Exception發生後執行特定動作,可使用ReportError

Task("Task")    
    .Does(() =>
{    
    throw new Exception("Throw Error Code : 2014");  
})
.ReportError(exception => {
    Information("Error Message :" + exception.Message);
});

OnError

如果想在Exception發生後執行特定動作,且後續任務又要持續進行,可使用OnError

Task("Task")    
    .Does(() =>
{    
    throw new Exception("Throw Error Code : 2014");  
})
.OnError(exception => {
    Information("Error Message :" + exception.Message);
});

RunTarget("Task");

ContinueOnError

完全忽略Error,可使用ContinueOnError

Task("Task")    
    .ContinueOnError()
    .Does(() =>
{    
    throw new Exception("Throw Error Code : 2014");  
});

 

Finally block

不管Task執行結果是否如何,最後一定會執行這個區塊

Task("Task")        
    .Does(() =>
{    
    Information("Task DoSomething");  
}).Finally(() =>
{  
    Information("Final DoSomething");
});;

RunTarget("Task");

 

Setup and teardown

前置Task與後置Task

Setup(() =>
{    
    Information("在第一個Task執行前會先執行");  
    
});

Teardown(() =>
{    
    Information("最後一個Task執行完後會執行");      
});

Task("Task")        
    .Does(() =>
{    
    Information("Task DoSomething");  
});

RunTarget("Task");

 

Script aliases

自訂Cake的Method或Property

Step 1:

開一個Library的專案

Step 2:

安裝Cake.Core

Step 3:

寫擴充Method與Property,寫完後編譯成dll

namespace MyCakeExtension
{
    public static class CakeExtension
    {
        [CakeMethodAlias]
        public static int SumTwoNumber(this ICakeContext context, int n1, int n2)
        {
            return n1 + n2;
        }

        [CakePropertyAlias]
        public static int ExtensionProperty(this ICakeContext context)
        {
            return 99;
        }
    }
}
Step 4:

將編譯後的dll放到Cake裡面去,讓dll可被引用

Step 5:

Script裡面引用自訂dll,並執行

#r "tools/cake/MyCakeExtension.dll"

Task("Task")        
    .Does(() =>
{    
    Information("MySumMethod : " + SumTwoNumber(10,20));
    Information("MyExtensionProperty : " + ExtensionProperty);  
});

RunTarget("Task");

 

Preprocessor directives

讀取其他Script

Step 1:

先在根目錄底下新增另一個Script檔案

Step 2:

寫Task

Step 3:

引用BuildForReferenced.cake

#load "BuildForReferenced.cake"

Task("Major")
    .IsDependentOn("Reference")
    .Does(() =>
{    
      Information("Major Task");
});

RunTarget("Major");

 

小結:

當初在研究這塊的時候,花了一點時間把這些基本用法看懂後,接下來在使用Cake的時候,還蠻得心應手的,可見這篇多麼重要XD。

 

 

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

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