大家看到 Google Gemini CLI(以下以及本系列都將簡稱之 Gemini)這個標題,大概會以為這又是一個 Gemini CLI 的教學。是 CLI 的教學沒錯,只是我想看看再進一步的東西... 喔,不對,是進好幾步的東西。
第一次看到 Gemini 剛上市的時候,不只是我,明眼人一看就知道這不就是抄隔壁棚的那個誰誰誰嗎!我不確定 Google 官方有沒有跳出來否認這件事,但比賽就是這樣的!好像跑步游泳一樣,還不是你做什麼他就做什麼!有什麼好抗議的?抗議無效!
不一樣的是,Gemini 專案是開放原始碼的,只要有心,人人都可以是食神... 不是,是只要有心,每個人都可以下載原始碼來看看裡面是怎麼回事。所以,既然隔壁棚的那個誰誰誰沒有開源,那我看看能不能從 Google 團隊所開發的 Gemini 的原始碼說來學點東西。
快速的看了一下 GitHub Repo,專案主要使用 TypeScript/JavaScript,應該不會太難懂,而且如果只有十幾萬行程式碼的話,雖然是個挑戰,但還不致於看不完。去年的鐵人賽寫了「為你自己讀 CPython 原始碼」系列文章,CPython 都啃的下去了,JavaScript 應該更不成問題(吧),所以,今年鐵人賽就來挑戰「為你自己學 Gemini CLI ... 的原始碼」系列文章吧!
是說,都什麼年代了,為什麼 CLI (Command Line Interface)這種看起來黑黑的而且有點落後的技術大家都拼命抄... 不是,是拼命做?可能是大家從出生開始就已經習慣 GUI 介面了,所以可能不知道 CLI 有哪些好用的地方:
對其它人來說可能還好,但這個功能對我這種原本就習慣使用 CLI 介面在做事的人真的是太香了!想像一下,你正在寫程式寫到一半,突然需要查個系統資訊、改個檔案權限、或是跑個 Docker 指令。以前你可能要切換視窗、開終端機、輸入指令、看結果、再切回來繼續... 現在呢可以直接在 CLI 裡面叫 AI 幫你執行這些指令。
重點是,這些 Shell 指令還不用自己寫,我們可以用自然語言跟 Gemini 說「幫我找出所有超過 100MB 的檔案並且按照大小排序」,AI 會自動幫你組合出 find . -type f -size +100M -exec ls -lh {} \; | sort -rh
這種你可能要 Google 半天才寫得出來的神奇指令。
不要小看這一根 |
,這可是個好東西!這根東西又稱「管線(Pipe)」,它可以把一個程式或指令的輸出結果當作另一個程式或指令的輸入,像接水管一樣把功能串起來,如果各位曾經接觸過「函數式程式設計(Functional Programming, FP)」可以把一堆函數串在一起,就會知道這東西有多好用。有了 AI CLI 之後,你可以像組樂高積木一樣,組出更有趣的組合技,例如:
$ cat error.log | gemini -p "分析這些錯誤訊息的模式" | claude -p "產生修復腳本" > fix.sh
先把錯誤日誌丟進去,最終產生修復的腳本,中間能把好幾家不同的 CLI 摻在一起做撒尿牛丸!這種組合技在 GUI 介面根本做不到。你可以把 AI 當成一個超級聰明的 grep
或 awk
來用,只是它懂自然語言而已。
每個編輯器都有自己的 AI 外掛:VS Code 有 Copilot、Windsurf、Cursor 有自己的 AI、JetBrains 也有... 問題是,這些 AI 都是綁在特定的編輯器裡,換個編輯器可能就得再熟悉一套,而且有些功能這個有另一個沒有。有了 CLI 版本,管你用什麼編輯器,反正都可以呼叫同一個 AI。你可以在 Vim 裡面用 :!gemini
呼叫它或是在 VS Code 開個終端機... 總之,一招走天下,不用再為了 AI 功能而換編輯器了。
「Server 為什麼這麼慢?是記憶體被吃光了嗎?」這樣的情況對老手來說可能不是什麼多難解決的問題,大概下個 top
或 htop
就能看出狀況,不過對沒經驗的新手來說可能就有點頭痛了。這時候 Gemini 就可以派上用場,直接在 Server 上把 Gemini 裝起來,請它分析系統狀態,或是直接請它針對問題寫個修復腳本,就不用來來回回測試好多次才能把問題抓出來。可能有些人沒想過可以這樣玩,但這對我來說真的是挺方便的!
提醒:投資理財有賺有賠,在 Server 上做這件事有其風險,請自行評估風險並且知道自己在做什麼,萬一出了什麼事請不要說是我教你的。
要研究原始碼,總得先想辦法取得一份,
$ git clone git@github.com:google-gemini/gemini-cli.git
$ cd gemini-cli
$ git switch 2135dbb6 --detach
HEAD 目前位於 2135dbb6 Fix #8077: Settings command overwrites entire JSON file, leaking environment variables (#8154)
為什麼特別切換到 2135dbb6
這個 Commit?沒什麼原因,就只是剛好我在寫這篇文章的時候 GitHub 上剛好就是這個 Commit,而且 Gemini 專案目前不斷的有新的 PR 被合併進來,不固定版本根本看不完。也就是說,如果各位想要跟著一起研究 Gemini 的原始碼,可以跟我一樣從這個 Commit 開始。
還需要什麼工具嗎?不用,只要準備一個順手的文字編輯器跟好奇心就夠了。
準備好了嗎?下一集就開始正式來翻 Gemini 的原始碼囉!