”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 开发 CLI

开发 CLI

发布于2024-08-27
浏览:276

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 Ch...
    编程 发布于2024-11-06
  • 评论:Adam Johnson 的《Boost Your Django DX》
    评论:Adam Johnson 的《Boost Your Django DX》
    书评很微妙。您不想破坏它,但您也想让潜在读者体验一下所期待的内容。这是提供背景和保持兴趣之间的巧妙平衡。我试图在这篇评论中达到这种平衡,为您提供足够的内容来吸引您,而不透露太多。 一个小背景故事:我第一次从 Djangonaut Space 的好朋友 Tim 那里听说这本书,并将其添加到我的阅读列表...
    编程 发布于2024-11-06
  • 如何对数组元素进行分组并组合多维数组中另一列的值?
    如何对数组元素进行分组并组合多维数组中另一列的值?
    按列对数组元素进行分组并组合另一列中的值给定一个包含两列嵌套数组的数组,任务是将基于特定列的子数组,并将每个组中另一列的值连接起来,生成一个以逗号分隔的列表。考虑以下示例数组:$array = [ ["444", "0081"], ["...
    编程 发布于2024-11-06
  • 三个新添加的例外功能
    三个新添加的例外功能
    从 JDK 7 开始,异常处理已扩展为三个新功能:自动资源管理、多重捕获和更准确的重新抛出。 多重catch允许您使用同一个catch子句捕获多个异常,避免代码重复。 要使用多重捕获,请指定由 | 分隔的异常列表。在 catch 子句中。每个参数都是隐式最终参数。 用法示例:catch(final...
    编程 发布于2024-11-06
  • 如何修复运行 ES6 代码时出现“意外的令牌导出”错误?
    如何修复运行 ES6 代码时出现“意外的令牌导出”错误?
    “排除意外的令牌导出错误”尝试在项目中执行 ES6 代码时,可能会出现“意外的令牌导出”错误。此错误表明所使用的环境不支持 ES6 模块中使用的导出关键字语法。错误详细信息以下代码片段举例说明了错误的来源: export class MyClass { constructor() { c...
    编程 发布于2024-11-06
  • 即使卸载后,VSCode 扩展也不会从文件系统中删除,我创建了一个解决方案!
    即使卸载后,VSCode 扩展也不会从文件系统中删除,我创建了一个解决方案!
    所以这是基于 vscode 的编辑器的问题。即使您卸载了扩展程序,它也会保留在文件系统中,并随着时间的推移堵塞您的系统。我创建了一个简单的解决方案。运行此 python 脚本将删除 vscode 上未安装的扩展。 它适用于 VS Code、VS Code Insiders,也适用于 VSCodiu...
    编程 发布于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 是一个广泛使用的库,它看起来可能很缓慢,引发了关于加快速度或探索替代选项的问题。让我们深入研究这个问题并探索可能的解决方案。提供的示例展示了具有多个子图和数据更新的图。使用 Matplotl...
    编程 发布于2024-11-06
  • 使用画布调整图像大小时如何克服锯齿状边缘和模糊结果?
    使用画布调整图像大小时如何克服锯齿状边缘和模糊结果?
    解决在 JavaScript 中使用 Canvas 调整图像大小时的平滑问题在 JavaScript 中使用 Canvas 调整图像大小有时会导致明显的锯齿状边缘或模糊。为了实现平滑的调整大小,可以采用一种称为向下步进的技术。在大多数浏览器中,默认情况下使用线性插值来调整大小。双三次插值可产生更平滑...
    编程 发布于2024-11-06
  • 如何解决 MySQL C# 中的文本编码问题?
    如何解决 MySQL C# 中的文本编码问题?
    修复 MySQL C# 中的文本编码问题使用实体框架在 C# 中处理 MySQL 数据库时,用户可能会遇到文本编码问题,特别是带有特殊字符,例如“ë”,渲染不正确。本文探讨了解决此常见问题的最合适的解决方案。要纠正编码问题,必须执行以下操作:验证排序规则设置: 确保所涉及的数据库或表的排序规则与 U...
    编程 发布于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