.net持續集成cake篇之cake任務依賴、自定義配置薦及環境變量讀取

.net持續集成cake篇之cake任務依賴、自定義配置薦及環境變量讀取
新建一個構建任務及任務依賴關係設置
上節我們通過新建一個HelloWorld示例講解了如何編寫build.cake以及如何下載build.ps1啓動文件以及如何運行.實際項目中,我們使用最多的是對項目進行編譯.本節我們講解如何創建一個編譯任務.

添加一個編譯任務
我們仍然使用上節使用的build.cake文件,我們複製一下Default任務,並把它改名爲BuildProject

代碼如下

Task("BuildProject")
.Does(() => {

Information("Hello World!");

});
通過上一節代碼我們可以看到Information方法僅僅輸出了一行信息,對我們構建可能並沒太大作用.Cake提供了一個Msbuild方法,我們可以使用該方法來編譯我們的項目,修改後的代碼如下

Task("BuildProject")
.Does(() => {

MSBuild("buildDemo.sln");//我的項目名稱叫作buildDemo.sln,這裏改爲你的實際項目名

});
添加完以上代碼後我們運行,發現構建並沒有執行,這是因爲這裏我們僅僅是定義了一個Task,並沒有執行它,我們需要顯式地執行這個任務

修改RunTarget方法
最下面的Runtarget默認接收的參數叫作target,我們 把它替換爲BuildProject

修改後代碼如下

RunTarget("BuildProject");
這時候我們再執行build.ps1可以發現編譯任務執行的(我們可以進到項目目錄下,看到目錄下生成了bin目錄,bin目錄下面生成了debug目錄,裏面有編譯的文件),如果bin目錄已經存在,我們可以把它刪除了,然後再執行任務,看看是否生成了bin目錄.

RunTarget是通過任務的名稱來確定要執行的任務的.

通過以上簡單的命令我們就實現了自動編譯一個.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("num",0);
默認值不是必須的,但是強烈建議代上默認值,如果沒有默認值,則必須傳入相應的參數,否則執行的時候就會報錯.

獲取環境變量值
對於一些複雜的構建,我們可能需要獲取環境變量的值,當然我們可以通過.net內置的方法來獲取環境變量的值,實際上Cake提供的簡單的方法來獲取環境變量的值,舉例我們想要獲取javahome環境變量的值,可以通過以下代碼獲取

var javaHome=EnvironmentVariable("JAVA_HOME");
我們都知道JAVA_HOME爲java_home環境變量的key,通過這個key來獲取環境變量的值.

以上獲取的都是簡單的鍵值對,如果是複雜的對象,則無法通過上述方法獲取,我們說過,這裏再強調一遍,cake實際上使用的就是C#語言,因此我們可以通過自己寫代碼來解析xml,json或者文本文檔等獲取複雜的配置,並轉成實體對象.
原文地址https://www.cnblogs.com/tylerzhou/p/11211066.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章