19. tháng 1 2025
Gần đây, tôi muốn tạo một công cụ dòng lệnh bằng Go để tự động sinh mã CRUD cho cả phía trước và phía sau của framework Gin. Mục tiêu là mang lại trải nghiệm tương tự như Django của Python trong việc xây dựng nhanh chóng giao diện quản trị admin. Tôi đã tìm thấy một công cụ tương tự gọi là Nunu, nhưng cấu trúc mã nguồn của dự án này không phải kiểu mà tôi thích, ngoài ra nó cũng không có template liên quan đến Ant Design ở phần frontend. Vì vậy, tôi quyết định tự làm lại từ đầu. Trước khi bắt tay vào code, tôi đã xem qua mã nguồn của Nunu và phát hiện rằng họ sử dụng thư viện Cobra, thật sự rất tiện lợi.
Trong thời gian tham gia Hội nghị Kinh tế Số Bát Giác Dã soi keo truc tiep tại Yên Đài, tôi vừa phát triển công cụ này vừa viết tài liệu này. Trong khi Giáo sư Ni Guangnan đang thuyết trình về AI ở trên bục, tôi lại ngồi dưới viết mã CRUD... Tuy nhiên, chúng ta đều hướng tới một tương lai tươi sáng! 🥲
Nếu bạn thường xuyên cần phát triển các công cụ dòng lệnh cục bộ bằng Golang, thì Cobra và Cobra-CLI sẽ giúp bạn khởi tạo dự án một cách hiệu quả, đồng thời làm cho mã nguồn trở nên rõ ràng hơn.
Cobra cung cấp chương trình riêng của nó để tạo ứng dụng của bạn và thêm bất kỳ lệnh nào bạn muốn. Đây là cách dễ nhất để tích hợp Cobra vào ứng dụng của bạn.
Lưu ý: "Cobra" trong tiếng Anh nghĩa là rắn hổ mang. 😱
1go install github.com/spf13/cobra-cli@latest
2go: downloading github.com/spf13/cobra-cli v1.3.0
3go: downloading github.com/spf13/cobra v1.3.0
4go: downloading golang.org/x/sys v0.0.0-20211210111614-af8b64212486
5which cobra-cli
6/home/zhongwei/golang/bin/cobra-cli
Bạn có thể tạo mới một dự án từ đầu:
1cobra-cli init [app]
Nếu dự án đã tồn tại, ví dụ bạn đã tạo nó bằng các lệnh sau:
1mkdir myapp
2cd myapp
3go mod init github.com/spf13/myapp
Bạn có thể dùng Cobra-CLI để tự động tạo khung code (scaffolding):
1cobra-cli init
Lưu ý: Nếu file main.go
đã tồn tại, Cobra-CLI sẽ tự động ghi đè lên file đó.
Sau khi khởi tạo, bạn sẽ thấy cấu trúc thư mục như sau:
.
├── LICENSE
├── cmd
│ └── root.go
├── go.mod
├── go.sum
└── main.go
Tất cả các lệnh đều có lệnh cha mặc định là
rootCmd
nếu không chỉ định khác.
Trong file root.go
, chứa lệnh cha của tất cả các lệnh con.
main.go
Dưới đây là đoạn mã được Cobra-CLI tự động tạo:
1package main
2
3import "go_snip/cmd"
4
5func main() {
6 cmd.Execute()
7}
Giả sử bạn muốn tạo một lệnh mới để phân tích các struct trong file model của dự án Gin và tự động sinh:
Để thực hiện điều này, bạn có thể dùng lệnh sau:
1cobra-cli add ginCrud
2ginCrud created at /mnt/d/work/go_snip
Lưu ý: Tên lệnh cần viết theo chuẩn camelCase (không dùng snake_case hoặc kebab-case). Ví dụ, cobra-cli add addUser
là đúng, trong khi cobra-cli add add-user
sẽ gây lỗi.
Sau khi chạy lệnh, bạn sẽ thấy file ginCrud.go
được tạo trong thư mục cmd
:
1ls cmd/
2ginCrud.go* root.go*
Dưới đây là nội dung của file ginCrud.go
:
1package cmd
2
3import (
4 "fmt"
5 "github.com/spf13/cobra"
6)
7
8var ginCrudCmd = &cobra.Command{
9 Use: "ginCrud",
10 Short: "Tạo mã CRUD cho Gin và Ant Design Pro dựa trên model",
11 Long: `Phân tích các struct trong file model và tự động sinh:
12- Controller API CRUD cho Gin
13- Cấu hình route
14- Trang danh sách, chỉnh sửa và tạo mới theo Ant Design Pro
15- Câu lệnh SQL để tạo bảng`,
16 Run: func(cmd *cobra.Command, args []string) {
17 fmt.Println("ginCrud called")
18 },
19}
20
21func init() {
22 rootCmd.AddCommand(ginCrudCmd)
23}
1go run main.go ginCrud
2ginCrud called
1go run main.go help ginCrud
2Phân tích các struct trong file model và tự động sinh:
3- Controller API CRUD cho Gin
4- Cấu hình route
5- Trang danh sách, chỉnh sửa và tạo mới theo Ant Design Pro
6- Câu lệnh SQL để tạo bảng
7
8Usage:
9 go_snip ginCrud [flags]
10
11Flags:
12 -h, --help Trợ giúp cho lệnh ginCrud
Bạn cũng có thể thấy lệnh ginCrud
xuất hiện trong trợ giúp của lệnh chính:
1go run main.go
2Mô tả chi tiết dài hơn về ứng dụng, gồm các ví dụ và cách sử dụng.
3Cobra là thư viện dòng lệnh dành cho Go, giúp tăng cường khả năng của ứng dụng.
4
5Usage:
6 go_snip [command]
7
8Các lệnh sẵn có:
9 completion Generate the autocompletion script for the specified shell
10 ginCrud Tạo mã CRUD cho Gin và Ant Design Pro dựa trên model
11 help Trợ giúp cho bất kỳ lệnh nào
12
13Flags:
14 -h, --help Trợ giúp cho go_snip
15 -t, --toggle Thông báo trợ giúp cho toggle
16
17Sử dụng "go_snip [command] --help" để biết thêm thông tin về một lệnh cụ thể.
Ví dụ, khi thực thi lệnh ginCrud
, bạn cần chỉ định đường dẫn đến file model.
Từ trợ giúp của lệnh chính, bạn có thể thấy rằng Cobra hỗ trợ tính năng hoàn thành lệnh tự động, rất tiện ích.
completion Generate the autocompletion script for the specified shell
Sử dụng Golang AST để phân tích các trường của struct và tự động sinh mã CRUD.