我的第一个Go命令行工具

2024/9/30 6:02:39

本文主要是介绍我的第一个Go命令行工具,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

我一直有点担心写关于我的经历的文章。不过,我觉得我现在可以应对了。那是一个八月的清晨,我决定写一个CLI工具,只是为了“练习”一下Go,因为我几天前刚刚学了一些基础知识。我现在不怎么看教程,但我看了Nana的视频关于Golang的内容,非常棒。所以,让我们直接开始吧。

原因

我想用Go语言来学习os模块。我的第一个想法是创建一个turborepo,使用Golang作为服务器。是的,我知道我们不能在Vercel上托管它,但我的想法是创建一个快速且安全的Golang服务器。我们可以在Vercel上使用API代理来重写客户端的请求。然而,你可能需要在一些地方(如Railway或Render)单独托管你的Go服务器。这并不遵循单仓库架构的原则,只是将所有代码保持在一个地方并构建一个强大的服务器。它被命名为turbo-g(turbo + go)。

好吧,在创建了一个turbo-g-template模板项目之后,我发现Turbo在热重载和其他很多方面存在一些问题。所以,最终我放弃了这个想法,转而去创建其他东西。

在创建这个模板项目时,我发现需要手动设置服务器,于是我使用了 gofiber,因为它具有类似 Express 的功能。作为一名 MERN 堆栈开发者,我发现它非常容易使用。后来我想到也可以为 Express 创建一个服务器项目生成器,但它们已经有了一个,叫做 express-generator。然后我想 Fiber 也应该有类似的东西。但是当我用 topic:go-backend-template 在 GitHub 上搜索时,我只找到了可以克隆并用于项目的预设模板。于是我就决定试一试。

过程

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

然后我卡在了叫做 templates 的东西上。模板是一个 Go 文件的骨架。模板包含了文件的内容。学习模板很有趣。然后我很容易地从标志中获取项目名称,并使用 os.MkdirAll 创建所有文件夹,并使用 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("❗创建目录 %s 失败: %w", dir, err)
            }
        }

进入全屏模式 退出全屏模式

遇到的问题

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

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

  • CLI 可以接受一个名为 -db 的用户输入,让用户选择像 MongoDB 或 PostgreSQL 这样的数据库,在配置模板中创建一个假连接。但是,随着代码的增长来解决这类问题,CLI 将变得不可用。它已经有 2 个必需的标志和一个可选的标志,分别是 --init-gh-name,如果我们再添加一个 -db 标志,命令将会变得很长。为了解决这个问题,我将把 CLI 修改为一个交互式的,类似于 create-next-app。经过这一改变,我们可以添加许多自定义选项。我已经开始着手处理这个问题了。所以,如果你想贡献代码,欢迎你。你可以在这里找到相关问题 这里。

  • 当前的最后一个问题是热重载模块。每当创建一个fiber应用时,默认情况下我们没有任何变更监听器。如果fiber已经内置了这个功能而我不知道的话,请原谅我的无知,因为我对这个库还比较新。如果你知道任何相关信息,请在评论中告诉我。为了解决这个问题,我决定在项目中包含air

结束

这是关于Optical的故事。然而,这篇博客也想让你了解这个小项目,并且如果你有兴趣,这也是一个邀请你为项目贡献的邀请。

旅程才刚刚开始,到目前为止非常有趣。我学到了很多东西,并且愿意继续学习更多。这是我在这里的第一篇博客,所以如果我有任何错误或遗漏的地方,请忽略并原谅我。下次会更好。

感谢大家阅读这篇博客,如果你觉得Optical很有趣,请给它点个⭐。另外,如果你知道有人愿意贡献代码,也请分享一下。如果你发现了任何问题或有任何改进建议,可以在这里创建一个issue。

谢谢再次。



这篇关于我的第一个Go命令行工具的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程