系列目錄html
上節咱們經過新建一個HelloWorld示例講解了如何編寫build.cake以及如何下載build.ps1啓動文件以及如何運行.實際項目中,咱們使用最多的是對項目進行編譯.本節咱們講解如何建立一個編譯任務.java
咱們仍然使用上節使用的build.cake文件,咱們複製一下Default任務,並把它更名爲BuildProject
shell
代碼以下json
Task("BuildProject") .Does(() => { Information("Hello World!"); });
經過上一節代碼咱們能夠看到Information方法僅僅輸出了一行信息,對咱們構建可能並沒太大做用.Cake
提供了一個Msbuild
方法,咱們可使用該方法來編譯咱們的項目,修改後的代碼以下c#
Task("BuildProject") .Does(() => { MSBuild("buildDemo.sln");//個人項目名稱叫做buildDemo.sln,這裏改成你的實際項目名 });
添加完以上代碼後咱們運行,發現構建並無執行,這是由於這裏咱們僅僅是定義了一個Task,並無執行它,咱們須要顯式地執行這個任務單元測試
最下面的Runtarget默認接收的參數叫做target,咱們 把它替換爲BuildProject
測試
修改後代碼以下ui
RunTarget("BuildProject");
這時候咱們再執行build.ps1
能夠發現編譯任務執行的(咱們能夠進到項目目錄下,看到目錄下生成了bin目錄,bin目錄下面生成了debug目錄,裏面有編譯的文件),若是bin目錄已經存在,咱們能夠把它刪除了,而後再執行任務,看看是否生成了bin目錄..net
RunTarget是經過任務的名稱來肯定要執行的任務的.debug
經過以上簡單的命令咱們就實現了自動編譯一個.net項目,Cake的強大之處還有不少,遠不止於此,後面咱們會有更多小節來說我解Cake的功能.
上面咱們修改了RunTarget
的參數讓它再也不執行默認任務,而是來執行BuildProject
,若是咱們想要執行Default任務又須要修改代碼來讓它執行默認任務,若是咱們有不少個任務,這樣修改很明顯是很繁瑣的,也與自動化構建格格不入(頻繁修改腳本嚴重背離了自動化初衷)
其實咱們可能經過設置任務依賴,讓默認任務依賴於構建任務,這樣在執行default以前會先執行構建任務,達到了兩個任務都被執行的目的.代碼以下
Task("BuildProject") .Does(() => { MSBuild("buildDemo.sln"); }); Task("Default") .IsDependentOn("BuildProject") .Does(() => { Information("Hello World!"); }); RunTarget(target);
經過Task的IsDependentOn
方法,咱們能夠設置Default任務依賴於BuildProject
任務
經過以上咱們僅僅是爲了讓BuildProject
和Default
兩個任務同時運行,並不能看到任務依賴做用的具體體現,實際項目中,咱們爲了編譯一個項目,首先要還原Nuget包,爲了運行單元測試,首先要編譯項目.若是步驟錯了,將會致使構失敗.
在一些複雜的構建任務中,每每不可能只運行一個固定腳本就萬事大吉,還須要根據實際須要在構建時傳入各類構建參數.將一些可能須要常常修改的項經過參數暴露出來每每也是一種良好的設計,極大地增長了構建的靈活性.固然一切還須要以實際需求爲準,不能爲了設計而設計,暴露過多配置項同時會增長使用者的壓力
在第一節HelloWorld示例中咱們的代碼裏最前面是兩段這樣的代碼
var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release");
前面章節咱們只講解了任務及簡單介紹了Setup和TearDown兩個特殊任務,並無講解上面這兩段代碼的前因後果,這節咱們把它們弄清楚.
咱們一開始就說過Cake文件裏的代碼都是C#代碼,也都必須符合C#語法規範.上面兩段代碼都包含var
關鍵字,在C#裏 var
是用來聲明一個變量的,實際上這裏也確實是聲明瞭兩個變量,其中Argument
帶有括號,裏面接收兩個參數,在C#裏它是方法,其中第一個參數是變量的名,第二個參數爲變量的默認值.
在RunTarget方法裏默認傳入的是target變量,它的默認值是
Default
,所以會去執行名字爲Default
的任務,至此,咱們應該明白爲何任務Default
會執行了.
下面咱們輸入下configuration看看它的值是什麼
代碼以下
var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release"); Information($"變量configuration的值是:{configuration}"); return; //下面的代碼省略
咱們說過Cake代碼其實是C#代碼,所以咱們能夠大但地使用C#語法,這裏使用return是爲了調試方便,程序運行到這裏就停止了,以防執行的任務過多執行的時間過長.
執行後咱們能夠看到輸入的是變量configuration的值是:Release
,target的值是Default,configuration的值是Release,這和直接定義變量沒有什麼太大區別好比直接定義var target=Default
這樣更爲方便.
前面咱們說過,Argument方法接收兩個參數,第一個是變量的名稱,其中變量是能夠經過外部傳遞進來的,這樣就極大的增長了靈活性.
經過從外部傳入參數,這樣就極大增長了腳本的靈活性,咱們能夠根據傳入的參數來決定要執行的邏輯從而不一樣的構建任務只須要修改參數而不須要修改腳本就能達到適應不一樣構建的目的.
前面執行build.ps1腳本的時候咱們什麼參數也沒有傳入,這裏咱們傳入configuration,代碼以下
.\build.ps1 -ScriptArgs "--configuration=Debug"
在powershell裏執行以上腳本,咱們能夠看到輸入的內容變量了變量configuration的值是:Debug
,能夠看到Cake腳本Argument方法已經接收到了名爲configuration
的變量的值,這裏使用的是傳入的值,而再也不是默認值
上面定義的兩個變量都是字符串類型的值,不少時候咱們須要傳入布爾值,或者int類型的值,固然咱們能夠經過c#內置的轉換命令把字符串轉換爲目標類型,然而咱們不須要這麼作,Argument是一個泛型方法,能夠接收泛型參數.例如如下會獲得一個Int的變量
var num=Argument<int>("num",0);
默認值不是必須的,可是強烈建議代上默認值,若是沒有默認值,則必須傳入相應的參數,不然執行的時候就會報錯.
對於一些複雜的構建,咱們可能須要獲取環境變量的值,固然咱們能夠經過.net內置的方法來獲取環境變量的值,實際上Cake提供的簡單的方法來獲取環境變量的值,舉例咱們想要獲取javahome環境變量的值,能夠經過如下代碼獲取
var javaHome=EnvironmentVariable("JAVA_HOME");
咱們都知道JAVA_HOME
爲java_home環境變量的key,經過這個key來獲取環境變量的值.
以上獲取的都是簡單的鍵值對,若是是複雜的對象,則沒法經過上述方法獲取,咱們說過,這裏再強調一遍,cake實際上使用的就是C#語言,所以咱們能夠經過本身寫代碼來解析xml,json或者文本文檔等獲取複雜的配置,並轉成實體對象.