一張表格先被畫好了:vmctl 把 VMware 包進了 prlctl 的手感
從 V2EX 開發者 normalcoder 釋出的 vmctl 出發,觀察一個把 VMware 包進 prlctl 手感的命令列介面,如何在表格輸出與旗標設計上替開發者補齊體驗。
本章章節
先從一個畫面看起。終端機裡輸入 vmctl list,跳出來的是一張畫好的表格:名稱、狀態、CPU、記憶體、客座系統、UUID,六欄資料用實線框起來,中英文混排對齊。沒有多餘的色彩,沒有進度動畫,就只是一張把現有虛擬機狀態講清楚的表。
這是開發者 normalcoder 近日(貼文發布於 2025 年內的 V2EX「分享創造」板塊)開源的工具 vmctl,一個 Parallels prlctl 風格的 VMware 命令列介面。原始碼放在 GitHub,並提供 Homebrew 安裝。動機寫得很老實:作者常年為了測試新工具反覆重灌乾淨系統,容器在部分安全與隔離場景不適用,繞了一圈還是回到對個人免費的 VMware,卻始終受不了官方 vmrun 的參數設計。
被比較出來的手感
這個專案的起點是一次比較。Parallels 的 prlctl 給了作者一套順手的動詞與受詞結構,prlctl list、prlctl start <vm>,換到 VMware 之後找不到對應物。vmrun 的問題在於路徑:快照、克隆、往客座系統拷檔案,每個操作都要記一長串 VM 檔案的路徑參數,用完即忘。而管 vSphere 又得開瀏覽器進網頁控制臺,腳本化做不到。
vmctl 的做法是在底層抽了一層統一的 Driver 介面,把本地 VMrun 與 vSphere 兩種後端收進同一套命令語彙。使用者面對的是 vmctl start、vmctl stop <vm> --hard、vmctl clone <vm> --name <new>,動詞短、受詞用名稱而非路徑。這是典型的介面翻譯工作:不改底層能力,只改使用者與能力之間的距離。
細節上能看出取捨。--hard 這個旗標同時出現在 stop 與 reset,語意一致地表達強制斷電與強制重啟;list 與 version 支援 --json 輸出,把給人看的表格與給腳本喫的資料分成兩種模式,一個 CLI 工具是否認真對待自動化場景,通常就看它有沒有這條路。克隆預設走連結克隆,--full 才做完整拷貝,文件裡也註明了兩個後端的差異:VMrun 要求來源 VM 已關機,vSphere 支援開機克隆。
官方介面的縫隙,社羣介面來補
VMware 被博通收購之後,產品調性向企業端傾斜,個人開發者的日常工作流從來不是它介面設計的優先順位。這件事在 GUI 上不明顯,到了命令列就全暴露出來:vmrun 的參數設計帶著十多年前系統管理工具的氣味,路徑導向、冗長、無表格式輸出。對照 OrbStack、Lima 這類新世代工具把 CLI 當第一級公民打磨的作法,落差更明顯。
vmctl 補的就是這道縫。它的價值不在發明新功能,VMware 本來就做得到這些事,而在把同樣的功能重新翻譯成開發者已經習慣的那套手感。prlctl 的命令風格在此像一種民間標準:當官方沒有給出好的介面,使用者會拿用過最好的那個當範本。
目前工具仍在早期,安裝只支援 Homebrew,手動安裝需自行編譯或走 GitHub Release。功能表還在擴充中。以一個出發點而言,它的方向是對的:介面的好壞往往取決於動詞選得多短、輸出排得多清楚,vmctl list 那張六欄表格,比任何宣傳文字都更能說明這個工具想成為什麼樣子。
主題 介面與互動設計
標籤 #vmctl+命令列介面設計、#vmware+開發者體驗、#prlctl+工具手感