寫命令行工具的人都有過這種體驗:你加了顏色高亮,結果用戶重定向輸出到一個文件,滿屏的控制碼亂飛;你想做個交互式選項列表,就得從頭處理方向鍵和回車;想要進度條,還得從零手搓一個,生怕和其他輸出混在一起。這些事本來不該由每個工具開發(fā)者操心。
Kiwify.Kiwi.Presentation 是 Kiwi 基金會工具鏈的基礎設施層,由 Presentation、Renderer、CLI 三個庫組成。Presentation 負責終端的樣式輸出、結構化數據展示和參數解析,是整個棧的地基。它不依賴任何外部包,只靠 .NET 基類庫就能跑。
它的核心思路很簡單:把終端的輸出行為抽象成兩層,一層管怎么畫,一層管說什么。
底層是 IOutputWriter,一個帶樣式的寫入器接口,有 Write、WriteLine、Flush 這些基本操作。背后的實現能自動識別終端是否支持 ANSI 轉義序列、有沒有被重定向,然后選擇對應的 ANSI 實現、純文本實現或者內存實現。開發(fā)者不需要寫一行判斷,通過 OutputWriterFactory 就能拿到適合當前環(huán)境的寫入器。Renderer 庫的全部渲染都經過這個接口,所以彩色表格、JSON 標記這些高級功能都建立在同一個輸出管道上。
上層是 IOutput,一個語義通道抽象,不關心文本長什么樣,只關心這段輸出想表達什么:WriteInfo 寫狀態(tài)信息,WriteResult 寫結果,WriteError 寫錯誤,WriteProgress 寫進度。CLI 庫用這些通道來分離幫助文本、驗證錯誤和用戶提示,方便測試里直接對某個通道的內容做斷言,也自然地把 stdout 和 stderr 的行為區(qū)分開。
在這兩個抽象上,Presentation 提供了四個獨立控件:樣式化文本、輸入提示、進度條和選項選擇器。每個控件都通過構建器接口使用,互不耦合。你可以只在某個方法里加上一個彩色輸出,不必把整個應用改造成事件驅動。所有這些打包在一個程序集里,除了 BCL 沒有其他 NuGet 依賴,想在任意 .NET 應用里用就可以用。
構建一個終端工具時,開發(fā)者需要處理顏色、回退、輸入驗證、進度報告、列表導航等一堆分散的問題。Presentation 的設計試圖用統(tǒng)一的輸出管道和四個獨立控件填平這些坑,讓代碼只描述意圖,庫來負責適配環(huán)境。這樣即便終端不支持 ANSI,輸出也能體面降級;即便重定向到文件,進度條不會把控制碼寫進去;選項列表不用重新實現鍵盤處理也能上下翻。這種“只管聲明意圖”的方式,正是產品思維在基礎庫上的體現。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.