首页  >  文章  >  后端开发  >  我的第一个使用 Go 的 CLI

我的第一个使用 Go 的 CLI

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-09-25 22:08:221037浏览

My first CLI with Go

我总是感到有点着急写下我的经历。好吧,我想我现在可以处理它了。那是八月的一个清晨,我决定编写一个 CLI 工具,只是为了“练习”Go,就像我几天前学习的基础知识一样。我现在看的教程不多,但我看了 Nana 的 Golang 视频,非常棒。那么,让我们直接开始吧。

原因

我想尝试用 Go 来学习 os 模块。我想到的第一个想法是创建一个以 Golang 作为服务器的turborepo。是的,我知道我们无法在 Vercel 中托管它,但我们的想法是使用 Golang 创建一个快速且安全的服务器。我们可以使用 Vercel 中的 API 代理来重写来自客户端的请求。但是,您将需要在一些地方(例如 Railway 或 Render)单独托管 Go 服务器。这不遵循单一存储库架构的规则,它只是将所有代码维护在一个地方并构建一个强大的服务器。它被命名为turbo-g(turbo + go)。

嗯,在创建模板项目后,我意识到 Turbo 在热重载和许多其他方面存在一些问题。所以,最终我放弃了这个想法,转而去创造别的东西。

在创建这个模板项目时,我发现我必须手动设置服务器,我使用了 go Fiber,因为它具有类似 Express 的功能,并且作为 MERN 堆栈开发人员,我发现它非常易于使用。有一次我想在 Express 中制作一个服务器项目生成器,但他们已经有了一个,它被称为express-generator。然后我想光纤也可能有同样的事情。但是,当我在 GitHub 中搜索主题:go-backend-template 时,我只找到了可以克隆并用于项目的预制模板。就在那时我决定尝试一下。

过程

使用 go 创建 CLI 相当简单,因为 go 代码被编译成二进制可执行文件。但是,我不知道如何使用 os 模块 创建文件和文件夹。在JavaScript(NodeJs)中,我们可以使用fs模块来管理文件。非常感谢文档帮助我。我也已经知道 Express 和 Fiber 中的基本后端项目是什么样的。我的方法非常简单。我将创建一个 CLI 工具,该工具将使用一些标志,例如 --init 和 --name 作为项目名称,它将生成一个项目和 go.mod,并以 Fiber 作为依赖项。

然后我陷入了所谓模板的困境。 模板是 go 文件的骨架。模板保存文件的内容。了解模板很有趣。然后很容易从标志中获取项目名称并使用 os.MkdirAlland 创建所有文件夹,使用 text/template 模块解析模板并获取创建文件的内容。这些模块的所有详细信息都可以在我上面提到的 Golang 文档中找到。然后就完成了! ?但是..

dirs := []string{"cmd", "internal/handlers", "internal/middleware", "internal/models", "internal/routes", "internal/services", "config"}
    for _, dir := range dirs {
        if err := os.MkdirAll(filepath.Join(projectPath, dir), os.ModePerm); err != nil {
            return fmt.Errorf("❗Failed to create directory %s: %w", dir, err)
        }
    }

存在的问题

  • 我很快发现我没有使用 github.com//作为模块名称,这是我第一次学习 go 模块时遇到的问题。然后我从这里了解了模块路径。所以,我为解决这个问题所做的事情非常简单。我刚刚添加了一个 -gh 标志,供用户添加他们的 GitHub 用户名来创建模块,假设项目名称是 GitHub 存储库。

  • 仍然存在的另一个问题是我没有在中间件模板文件和配置模板文件中提供任何代码。用户可以使用 MongoDB 或 PostgreSQL 作为数据库,因此无需在模板中提供任何单个或两个配置。好吧,为了解决这个问题,我创建了一个问题,任何阅读此博客的人都可以为解决这个问题做出贡献。我已经找到办法了,但这归结为第三个问题。

  • CLI 可以采用名为 -db 的用户输入来获取用户选择的数据库(例如 MongoDB 或 PostgreSQL),以便在配置模板中建立虚拟连接。但是,随着代码的增长来解决此类问题,CLI 将无法使用。它已经有 2 个必需标志和一个可选标志,即 --init、-gh 和 -name,如果我们添加一个 -db 标志,这将是一个非常长的命令。为了解决这个问题,我将把 CLI 修改为交互式 CLI,如 create-next-app。进行此更改后,我们可以添加许多自定义选项。我已经在做这件事了。因此,如果您想做出贡献,我们欢迎您。您可以在这里找到问题。

  • 现在的最后一个问题是热重载模块。每当我们创建 Fiber 应用程序时,默认情况下我们没有任何更改侦听器。如果纤维已经有这个,而我不知道,那么请原谅我,因为我对此还比较陌生。如果您对此有任何了解,请在评论中告诉我。为了解决这个问题,我想出了在项目中包含空气

结束

这是光学的故事。然而,该博客的目的是让大家了解这个小项目,并且如果您愿意的话,它也是一个为该项目做出贡献的邀请。

旅程才刚刚开始,到目前为止还很有趣。我学到了很多东西,并且愿意在未来学习更多。这是我在这里的第一篇博客,所以如果我犯了任何错误或忽略了某些内容,请忽略并原谅我。下次会更好。

感谢大家阅读博客,如果您觉得有趣,请给光学一个⭐。另外,如果您知道有人愿意贡献,请分享。另外,如果您发现任何问题或有任何改进的想法,您可以在这里创建问题

再次感谢。

以上是我的第一个使用 Go 的 CLI的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn