繼上篇介紹的[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。
一天一分享,身體好健康。
該追究的不是過去的原因,而是現在的目的。