我的第一个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命令行工具的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-30初学者指南:轻松掌握模块化编程
- 2024-09-30顶级5款免费的IntelliJ插件,助你Java开发之路更顺畅
- 2024-09-30提高应用程序可用性:冗余和持久性
- 2024-09-30Twitter 系统设计面试示例
- 2024-09-30JSON对象入门教程:轻松掌握基础用法
- 2024-09-30封装入门:Java面向对象编程的第一步
- 2024-09-30后台交互入门:轻松掌握基础知识与实践技巧
- 2024-09-30轻松入门:后台交互教程详解
- 2024-09-30后台交互项目实战:新手指南
- 2024-09-30JSON对象项目实战:从零开始的全面解析与应用