.net持續整合cake篇之使用vs或者vscode來輔助開發cake指令碼

周國通發表於2019-07-22

系列目錄

使用Visual Studio來開發工具

前面我們都是通過手寫或者複製的方法來編寫Cake檔案,Cake使用的是C#語言,如果僅使用簡單的文字編輯器來編寫顯然效率是非常低下的,本節我們講解如何使用cake Visual Studio外掛來通過模板建立cake檔案,以及如何使得Visual Studio來除錯Cake檔案

安裝Cake Visual Studio外掛

我們在Visual Studio外掛管理器裡搜尋Cake就可以搜尋到Cake for visual studio外掛,然後我們安裝它.

關於Visual外掛搜尋和安裝我們這裡不再贅述,假定看的童鞋都有一定.net程式設計基礎.

外掛安裝完成後,我們再通過Vs新增內容的時候,就可以看到Cake模板

avatar

建立的時候我們把它的名稱修改為build.cake(這裡仍然是慣例,其實也可以是其它名稱,但是需要做相應修改,這裡先不介紹)

我們使用Vs開啟Cake檔案,可以看到雖然沒有智慧提示,但是有一些基本的程式碼著色

avatar

如果關鍵字有錯誤,則程式碼不會高亮著色顯示.

使用Visual Studio對Cake指令碼進行除錯

對於複雜的構建指令碼,我們可能需要通過除錯來發現排除一些bug,下面介紹如何使用Visual Studio 對Cake指令碼進行除錯.

我們修改build.ps1把最後面三段的內容修改為如下:

#&$CAKE_EXE $cakeArguments
Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"Diagnostic`" $UseMono $UseDryRun $UseExperimental $ScriptArgs --debug"
exit $LASTEXITCODE

實際上做的改動是把&$CAKE_EXE $cakeArguments這一行註釋掉了,新增了下面Invoke-Expressions這一行,其實中--debug是必要的,指明是以debug方式啟動指令碼,這樣指令碼在啟動後會處於暫停狀態,讓我們有機會通過Vs來附加這個程式

我們首先執行修改後的ps1檔案,出現如下資訊

Preparing to run build script...
Running build script...
Module directory does not exist.
NuGet.config not found.
Performing debug...
Attach debugger to process 21244 to continue

其實中process id每一次都是不一樣的,因此讀者看到的和上面的可能是不一樣的.

我們在Vs裡開啟要除錯的cake檔案,設定斷點,然後執行除錯->附加到程式在出現的對話方塊中找到指令碼提示的程式(實際上為cake.exe程式),然後點選這樣就附加程式就成功了.

我們可以看到,斷點被擊中了

avatar

我們可以像除錯普通C#指令碼一樣除錯cake檔案.

使用Visual Studio Code開發工具

雖然Cake提供了vs外掛,但是不論是開發和除錯體驗都不是很好,而cake vs code外掛則支援cake檔案生成,啟動檔案build.ps1下載,程式碼智慧提示和除錯功能.本節將詳細介紹這些功能.

一.安裝cake vscode外掛

這裡我們刪除build.cake和build.ps1檔案,使用vscode來生成它們.

使用vscode 開啟專案(檔案->開啟資料夾)或者在專案所在目錄點選右鍵,在右鍵選單中選擇在此處開啟vscode選項.

開啟後我們在外掛標籤裡搜尋cake這樣就開啟了搜尋搜尋介面

avatar

由於我已經安裝過了,因此後面變成了齒輪圖示,如果沒有安裝則會出現安裝按鈕,安裝完成後重新載入或者重啟vscode方可生效.

然後,我們按下ctrl+shift+p在出現的命令列裡面輸入cake會出現以下命令

avatar
我們選擇Install to workspace下面會讓你確認檔名,點選駕車即可,然後還有有一些提示,只需要一路選擇yes就行了.

完成後會在當前工作區新增build.cake和build.ps1檔案

二.新增智慧提示

cake Vscode外掛一個非常酷的功能就是智慧提示,有了智慧提示我們編碼的效率和質量將大大提高.

仍然像上面一個按下ctrl+shift+p在出現的命令框中輸入cake,在出現的下拉中選擇Install intellisense support 過一會後會後vscode右下角會出現安裝成功提示.如果不確定是否安裝成功可以再執行一次安裝,如果已成功安裝則提示已經安裝.

有了智慧提示以後,我們輸入task,就會出現提示列表

avatar

需要注意的是智慧提示是針對專案環境的,如果是新的專案,仍然需要再次在工作區執行安裝.

三.在vscode裡除錯cake檔案

我們在vscode裡點選蟲子圖示,然後點選右向綠色箭頭,這時候中間會出現輸入框,我們輸入cake便會出現與cake相關的除錯配置選項

avatar

如果沒有反應,再次執行一次.

avatar

如果執行成功,這裡的文字會變成如圖示,如果沒有成功,則顯示的是No configuration

成功後,再點選綠色右向箭頭,如果指令碼沒有錯誤,斷點會被擊中

avatar

有了這些貼心的工具,相信大家不會再對cake心有恐懼了.

四.vscode除錯cake檔案之高階技巧

我們知道,正常執行cake是通過build.ps1指令碼啟動的,通過ps1指令碼啟動可以傳入一些自定義的引數,而在vscode裡則是直接點選除錯按鈕進行除錯的,這樣我們就無法通過ps1檔案傳入引數了,當然我們可以通過修改cake指令碼引數或者通過debug指令來除錯,然而這些都不是最好的選擇,修改cake檔案裡的變數後如果忘記修改回原來值則上線後可能出現問題.增加debug對於一些簡單的指令碼檔案來說顯示是小題大作了.其實我們可以通過修改launch.json來實現模擬外部傳入引數

在vscode裡搜尋檔案快捷方法如下:按下ctrl+p然後輸入要搜尋的檔名稱

預設生成的launch.json檔案如下

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cake: Debug Script (CoreCLR)",
            "type": "coreclr",
            "request": "launch",
            "program": "${workspaceRoot}/tools/Cake.CoreCLR/Cake.dll",
            "args": [
                "${workspaceRoot}/build.cake",
                "--debug",
                "--verbosity=diagnostic"
            ],
            "cwd": "${workspaceRoot}",
            "stopAtEntry": true,
            "externalConsole": false
        }
    ]
}

我們在args里加入一個configuration引數

修改後如下

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Cake: Debug Script (CoreCLR)",
            "type": "coreclr",
            "request": "launch",
            "program": "${workspaceRoot}/tools/Cake.CoreCLR/Cake.dll",
            "args": [
                "${workspaceRoot}/build.cake",
                "--debug",
                "--verbosity=diagnostic",
                "--configuration=debug"
            ],
            "cwd": "${workspaceRoot}",
            "stopAtEntry": true,
            "externalConsole": false
        }
    ]
}

我們通過單步除錯或者通過控制檯輸入的方式可以看到,configuration引數的值傳入了.

相關文章