前幾天提到開源專案 - Gitea 不僅跨平台、安裝設定超簡單(一個 exe 檔就搞定,還內建設定介面),號稱「輕量級」功能卻不陽春,不愧是架設 Git 私服的第一品牌。但對我而言有一點美中不足,Gitea 用 Golang 開發,用不順手想自己動手修改,我連專案怎麼開啟都不知道。

大部分的人都下載安裝 Gitea 後就用得開心,比較少聽到有人想不開抓原始碼回來改,何況還是完全沒摸過 Go 的麻瓜。不過,Gitea 的一些設計很吸引我,例如:單一 EXE 檔跑網站、支援 OAuth2 及 LDAP 整合,讓我有一窺奧秘的衝動。所以我做了正常人不會做的事 - 沒學過 Golang 還硬要 Line-By-Line 偵錯 Gitea。

這篇筆記對熟悉 Golang 開發或沒興趣碰 Gitea 原始碼的人都是廢文,但如果你想知道不知天高地厚的 Golang 麻瓜如何靠 Google 爬文用 VSCode 偵錯比 "Hello, World" 複雜一百倍的 Gitea 專案,或是也想做類似的傻事,再繼續讀下去吧。

首先,從 Github 取回 Gitea 原始碼,光根目錄就有 20 個資料夾分門別類,總計 9,987 個檔案,意味系統有一定複雜度:(媽呀,學新語言不是該從 Hello, World 開始嗎?我到底在幹嘛?)

寫 C# 要用 Visual Studio,C# 之外的程式語言,當然就是 VSCode 囉! 繼 Node.js、OpenSCAD、Arudino、PowerShellPython 之後,我用 VSCode 挑戰的語言再 +1。

VSCode 的功能全靠套件堆砌,直接裝保哥的 Go 套件懶人包 - Go Extension Pack:

裝好之後,開啟 .go 程式檔,滑鼠移到函式會出現函式說明,代表 Intellisense 就緒:

按滑鼠右鍵,F12 追定義、Find All References、Rename 等功能也都有了:

有了這些功能,要追程式碼就方便了。再下一步是做到線上偵錯,觀察程式碼互動及即時監看變數,這樣還學不會改不動程式,就是個人能力問題了。

在 VSCode 要執行程式需要設定 launch.json,開啟 main.go (或任何 .go 檔),點左側的 Run (1)、點 Create a launch.json file (2),再選 Go: Launch Package (3):

VSCode 會在 .vscode 目錄產生一個 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": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}"
        }
    ]
}

按下 F5 (Start Debugging),Debug Console 出現 Starging new server: tcp:0.0.0.0:3000 on PID 字眼,開啟瀏覽器連上 localhost:3000,熟悉的 Gitea 設定頁面出現:

但有個問題,資料庫選項只有 MySQL、PostgreSQL、MSSQL,不包含 SQLite3。依據文件,要啟用 SQLite,編譯時需加上 TAGS="sqlite sqlite_unlock_notify" 建置參數(想讓 Gitea 用單一檔案跑網站,則靠 bindata 參數 (Build a single monolithic binary, with all assets included.))。實測發啟用 sqlite 編譯會出錯:ld.exe: Error: export ordinal too large: 102106 錯誤,爬文加上 buildemode=exe 可避免。修改 launch.json 加上 buildFlags 參數如下:

{
    // 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": "Launch Package",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "${workspaceFolder}",
            "showLog": true,
            "buildFlags": "-buildmode=exe -tags='sqlite sqlite_unlock_notify'"
        }
    ]
}

就醬,我成功設定中斷點,鑽進程式碼 Line-By-Line 逐步偵錯,觀察變數內容,進化成為「會用 VSCode Debug Golang 程式的男人」,哈!

My experience to debug Golang project with VSCode.


Comments

Be the first to post a comment

Post a comment