cmd/opencodereview/main.go — 單一二進位入口

telemetry 初始化 + rootCmd 分派
檔案:cmd/opencodereview/main.go(29 行)

大方向

main.go 是 OCR 二進位的真正入口,只有 29 行。它做三件事:把版本號注入 llm 套件、初始化內嵌資源載入器、初始化遙測,最後把控制權交給 rootCmd.Execute()(cobra 根命令,定義在 root.go)。所有子命令(review/scan/config/llm…)都是透過 init() 註冊到 rootCmd 上的。


1. 版本注入與資源載入

main() main.go把 Version 注入 llm、初始化內嵌 loader、初始化遙測、執行 root 命令。

llm.AppVersion = Version 把建置時寫入的版本字串注入 llm 套件——這是 ocr version 輸出來源之一。llm.InitEmbeddedLoader() 初始化內嵌資源載入器(tiktoken BPE 檔、內建工具 JSON 等會被編譯進二進位)。

教學重點:Go 的 main() 極簡是「command 物件」模式的特色——真正的邏輯在 cobra 命令的 RunE 回呼,main 只負責拉起與收尾。

2. 遙測初始化

telemetry.Init(ctx) · telemetry.ShutdownWithTimeout() main.go條件式啟用遙測,並確保結束前 flush。

telemetry.Init(ctx) 回傳 bool——遙測預設關閉,只有 config 或環境變數啟用時才為 true。若啟用,defer telemetry.ShutdownWithTimeout(ctx, 5*time.Second) 保證程式結束前把 span/metric flush 出去。

3. 執行與錯誤處理

rootCmd.Execute() main.gocobra 根命令執行,錯誤印到 stderr 並以碼 1 退出。

if err := rootCmd.Execute(); err != nil 是標準 cobra 用法:命令解析 + 子命令分派都在這發生。錯誤以 Error: %v 印到 os.Stderr(不是 stdout——保持 stdout 乾淨給 JSON 輸出)並 os.Exit(1)

看完這頁你應該能說出:main 極簡的原因、llm.AppVersionInitEmbeddedLoader 各做什麼、遙測為何是條件式 defer、以及錯誤為何寫 stderr 而非 stdout。

下一步:review_cmd.go(真正做事的命令)。