」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 開發 CLI

開發 CLI

發佈於2024-08-27
瀏覽:395

Developing CLIs

构建 CLI 功能通常可以归结为:

  • 发布新的 API 端点。
  • 构建需要 API 更改的新 CLI 操作。
  • 意识到您刚刚发布的 API 中出现了错误。
  • 尝试修复此功能的 API,以免将来产生更多问题。
  • 尝试记住您想要在 CLI 中实现的目标,然后实际实现它。  
  • GOTO:意识到犯了错误。

每一步都需要之前的一步,哎呀我们已经重新发明了瀑布项目管理。你会被痛苦所折磨,试图优雅地弥补错误,直到你一瘸一拐地恢复正常,但在出色之前就退出了。不要让我开始维护由此产生的临时“修复”和缺陷集群。

去过那里,做到了。我们知道我们需要超越瀑布式的方法。

以下是我们如何实现这一目标的故事以及一路上提供帮助的一些工具。

粗略的开始

我们想要廉价、快速的迭代,直到我们理解了该功能,然后才致力于昂贵的实施和长期支持。作为一个小团队,我经常从头到尾地执行这个过程,并希望依次关注每个部分。我们想要伪造实现部件,直到我们有足够的信心来制造它。

回到流程,首先是提出功能。我们想要摆脱抽象,但如果这意味着不成熟的实现,我们就不想这样做。受到 Github 此处描述的 Google Docs CLI 草图方法的启发,我们用“草图”伪造了它。

不幸的是,静态草图并没有给我们提供我们想要的反馈。我们的 CLI 随着时间的推移改变输出,更像是动画而不是绘图。为了实现更高的保真度,我编写了一些 Ruby 程序来获取基本输入并通过打印适当的预设响应来进行响应。

从那时起,我们找到了一种更好的方法来捕获动画 CLI 输出,但要解释这一点需要绕一些弯路。

你甚至测试过吗?

当我们开始充实我们的 CLI 时,我们还想测试边缘情况并检测回归。我调查了基于 Cobra/bubbletea 的公共 CLI 来寻找想法,但令人沮丧的是,测试很少。然后我们偶然发现了 Charm 的 Teatest,这给了我们一个起点。

Teatest 专注于黄金测试,捕获已知的良好输出,然后断言未来的输出继续与其匹配。这让我们再次回到了动画 CLI 输出的高保真捕获。 Teatest 为我们提供了基于框架的解决方案的好主意,例如翻页书,我们以此为基础:

─── SigninHeader ───────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
─── SigninInput --──────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    ? What is your username?
    ? user
─── SigninInput ────────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    * Signing in to your CLI account… ⠋
─── SigninInput ────────────────────────────────────────────────────────────────
# Signin To Your CLI Account `cli auth signin`
    * Signed in to your CLI account: [email protected]

这个简化的示例显示了基本授权命令的黄金输出可能是什么样子。水平线描绘框架,并带有指示活动模型的标签。总而言之,即使添加、删除或替换行,我们也能获得高保真度的输出捕获。

我们在测试套件中使用一个标志来更新具有黄金输出的文件,否则如果输出与文件不匹配,测试就会失败。这使我们能够了解输出的变化,并通过让我们了解输出应该是什么样子以及它是否发生变化来促进公关审查。我们非常喜欢它,因此计划将我们的草图程序替换为 Github 风格谷歌文档中的黄金风格输出,这样我们就可以捕获动画和风格创意。

有了我们曾经和未来的草图,让我们回到开始使用新的 API 端点。

一起设计 API 和 CLI

我们同时处理 API 和 CLI,因为这些的最佳设计源于紧密集成。我们能够做到这一点,同时仍然避免瀑布的危险,通过在更便宜的环境中迭代设计并等待直到需求固化为止。对于我们的 API,这意味着使用 OpenAPI 绘制草图:

openapi: 3.1.0
info:
  contact:
    email: [email protected]
  description: An example API.
  title: Example API
  version: 0.0.1
servers:
  - url: https://api.example.com
tags:
  - description: account operations
    name: account
paths:
  '/v0/auth/signin':
    post:
      description: Signin to CLI.
      operationId: auth_signin
      responses:
        '200':
          content:
            'application/json':
              schema:
                additionalProperties: false
                properties:
                  email:
                    description: Email address for authenticated user.
                    example: [email protected]
                    type: string
                required:
                  - email
                type: object
          description: Successful signin.
      summary: Signin to CLI.
      tags:
        - account

这个简化的示例显示了基本授权命令的架构可能是什么样子。我们使用光谱检查来简化这些文件的处理。

有了草图,我们就可以在实现 CLI 时使用 prism 作为模拟 API 服务器。当我们不可避免地意识到犯了错误时,我们可以调整规范并返回到 CLI 迭代。在这种高水平上工作使我们能够一起发展 API 和 CLI,并推迟昂贵的实施,直到我们有更好的知识。

实施 API

我们还依赖 OpenAPI 规范,以便在使用委员会的实施过程中保持诚实。 assert_schema_conform 测试对齐情况,中间件会通知我们任何实时差异。这些结合起来允许红绿实施,同时保护我们免受回归。

使用模拟和代理进行测试

为了解决这个问题,我们的测试套件使用标志在模拟或代理模式下运行 prism。通过使用标志,我们可以专注于只编写一种测试,尽管这确实意味着我们在一种模式或另一种模式下跳过一些测试。我们在 Windows 和 macOS 上使用模拟测试来测试它们的速度,而我们的完整堆栈不在 CI 中运行。我们的代理测试让我们只需添加一个标志即可对整个堆栈运行测试,从而在我们认为有必要时轻松运行端到端测试。

将所有内容整合在一起

草图和规格帮助我们迭代抽象,而不必陷入实现的困境。然后模拟和代理帮助我们确保实现与草图相匹配。通过继续迭代我们的流程,每个功能都会减少痛苦,我们在构建本月晚些时候将提供的团队体验时对此深表赞赏。

我们将不断迭代我们的流程,我希望您从中学到一些东西,我也很乐意向您学习。你尝试过什么,哪些地方值得你骄傲,哪些地方仍然令人沮丧?

版本聲明 本文轉載於:https://dev.to/anchordotdev/developing-clis-o14?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • ## 您可以在不使用 JavaScript 的情況下使用 CSS 建立餅圖分段嗎?
    ## 您可以在不使用 JavaScript 的情況下使用 CSS 建立餅圖分段嗎?
    使用 CSS 在圓中分段使用 border-radius 在 CSS 中建立圓是一種常見的做法。但是,我們可以透過分段(類似餅圖)來實現類似的效果嗎?本文深入研究了僅透過 HTML 和 CSS 實現此目的的方法,不包括使用 JavaScript。 產生相等大小的段相等大小段的一種方法涉及產生以下內容...
    程式設計 發佈於2024-11-06
  • 從頭開始建立一個小型向量存儲
    從頭開始建立一個小型向量存儲
    With the evolving landscape of generative AI, vector databases are playing crucial role in powering generative AI applications. There are so many vect...
    程式設計 發佈於2024-11-06
  • 如何在Chrome使用AI實驗API
    如何在Chrome使用AI實驗API
    要在 Chrome 中使用實驗性 AI API,請依照下列步驟操作: 硬體需求 4GB 記憶體 GPU可用 至少 22GB 空間 Windows 10.11 或 macOS Ventura 或更新版本(無 Linux 規格) 尚不支持: Chrome作業系統 Chrome iOS C...
    程式設計 發佈於2024-11-06
  • 評論:Adam Johnson 的《Boost Your Django DX》
    評論:Adam Johnson 的《Boost Your Django DX》
    書評很微妙。您不想破壞它,但您也想讓潛在讀者體驗所期待的內容。這是提供背景和保持興趣之間的巧妙平衡。我試圖在這篇評論中達到這種平衡,為您提供足夠的內容來吸引您,而不透露太多。 一個小背景故事:我第一次從 Djangonaut Space 的好朋友 Tim 那裡聽說這本書,並將其添加到我的閱讀清單中...
    程式設計 發佈於2024-11-06
  • 如何將陣列元素分組並組合多維數組中另一列的值?
    如何將陣列元素分組並組合多維數組中另一列的值?
    按列將數組元素分組並組合另一列中的值給定一個包含兩列嵌套數組的數組,任務是將基於特定列的子數組,並將每個組中另一列的值連接起來,產生以逗號分隔的清單。 考慮以下範例陣列:$array = [ ["444", "0081"], ["44...
    程式設計 發佈於2024-11-06
  • 三個新加入的例外功能
    三個新加入的例外功能
    從 JDK 7 開始,異常處理已擴展為三個新功能:自動資源管理、多重捕獲和更準確的重新拋出。 多重catch可讓您使用同一個catch子句擷取多個異常,避免程式碼重複。 要使用多重捕獲,請指定由 | 分隔的異常清單。在 catch 子句中。每個參數都是隱式最終參數。 用法範例:catch(f...
    程式設計 發佈於2024-11-06
  • 如何修復執行 ES6 程式碼時出現「意外的令牌匯出」錯誤?
    如何修復執行 ES6 程式碼時出現「意外的令牌匯出」錯誤?
    「排除意外的令牌匯出錯誤」嘗試在專案中執行ES6 程式碼時,可能會出現「意外的令牌導出”錯誤。此錯誤表示所使用的環境不支援 ES6 模組中使用的匯出關鍵字語法。 錯誤詳細資料以下程式碼片段舉例說明了錯誤的來源: export class MyClass { constructor() { ...
    程式設計 發佈於2024-11-06
  • 即使卸載後,VSCode 擴充功能也不會從檔案系統中刪除,我建立了一個解決方案!
    即使卸載後,VSCode 擴充功能也不會從檔案系統中刪除,我建立了一個解決方案!
    所以這是基於 vscode 的編輯器的問題。即使您卸載了擴充功能,它也會保留在檔案系統中,並隨著時間的推移堵塞您的系統。我創建了一個簡單的解決方案。執行此 python 腳本將刪除 vscode 上未安裝的擴充功能。 它適用於 VS Code、VS Code Insiders,也適用於 VSCod...
    程式設計 發佈於2024-11-06
  • 透過 GitHub Actions 按計畫更新網站內容
    透過 GitHub Actions 按計畫更新網站內容
    我想分享我建立一個自我永續的內容管理系統的旅程,該系統不需要傳統意義上的內容資料庫。 問題 該網站的內容(部落格文章和書籤)儲存在 Notion 資料庫中: 附書籤的資料庫 –  Notion UI 我試圖解決的問題是不必在添加每個書籤後手動部署網站。最重要的是 - 保持託管盡可能...
    程式設計 發佈於2024-11-06
  • 如何在 Laravel 5 應用程式的共享託管環境中清除快取?
    如何在 Laravel 5 應用程式的共享託管環境中清除快取?
    如何從 Laravel 5 中的共享託管伺服器清除快取清除快取對於維護 Laravel 應用程式的效能和效率至關重要。但是,在您可能無法存取 CLI 的共享託管環境中,清除快取可能是一個挑戰。 清除視圖快取的解決方法在這種情況下,您可以透過在 CLI 之外呼叫 Artisan 命令來解決此問題。要清...
    程式設計 發佈於2024-11-06
  • 如何加速 Matplotlib 繪圖以提高效能?
    如何加速 Matplotlib 繪圖以提高效能?
    為什麼 Matplotlib 這麼慢? 在評估 Python 繪圖庫時,考慮效能很重要。 Matplotlib 是一個廣泛使用的函式庫,它看起來可能很緩慢,引發了關於加快速度或探索替代選項的問題。讓我們深入研究這個問題並探索可能的解決方案。 提供的範例展示了具有多個子圖和資料更新的圖。使用 Matp...
    程式設計 發佈於2024-11-06
  • 使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?
    使用畫布調整影像大小時如何克服鋸齒狀邊緣和模糊結果?
    解決在JavaScript 中使用Canvas 調整影像大小時的平滑問題在JavaScript 中使用Canvas 調整影像大小有時會導致明顯的鋸齒狀邊緣或模糊。為了實現平滑的調整大小,可以採用一種稱為向下步進的技術。 在大多數瀏覽器中,預設使用線性內插法來調整大小。雙三次插值可產生更平滑的結果,涉...
    程式設計 發佈於2024-11-06
  • 如何解決 MySQL C# 中的文字編碼問題?
    如何解決 MySQL C# 中的文字編碼問題?
    修復MySQL C# 中的文字編碼問題使用實體框架在C# 中處理MySQL 資料庫時,使用者可能會遇到文字編碼問題,特別是帶有特殊字符,例如“ë”,渲染不正確。本文探討了解決此常見問題的最合適的解決方案。 要修正編碼問題,必須執行以下操作:驗證排序規則設定: 確保所涉及的資料庫或表的排序規則與UTF...
    程式設計 發佈於2024-11-06
  • 如何將美麗搜尋與 Node.js 集成
    如何將美麗搜尋與 Node.js 集成
    作為 Node.js 開發人員,建立能夠提供快速且準確的搜尋結果的應用程式非常重要。使用者期望立即得到相關的回應,但實現起來可能具有挑戰性,特別是在處理大型資料集時。 這就是美麗搜尋的用武之地——一個為輕鬆滿足這些需求而構建的搜尋引擎。 什麼是美麗搜尋? Meilisearch ...
    程式設計 發佈於2024-11-06
  • 平行 JavaScript 機
    平行 JavaScript 機
    作者:Vladas Saulis,PE Prodata,克萊佩達,立陶宛 2024 年 5 月 18 日 抽象的 本文提出了一種新的程式設計模型,可以以簡單且自動平衡的方式利用多核心 CPU 系統。該模型還提出了一種更簡單的程式設計範例,用於在大多數大規模平行計算領域(例如天氣預報、核子物理、搜尋引...
    程式設計 發佈於2024-11-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3