Tạo một trình tải nhạc với Cobra, Viper, Prompt UI trong Golang

Duc Ho
Open Commerce Group
5 min readJul 22, 2019
Photo by Marvin Meyer on Unsplash

Ở bài viết này, mình muốn hướng dẫn các bạn cách tạo một CLI đơn giản trong Golang với các thư viện bao gồm Cobra, Viper và PromptUI. Chúng ta sẽ làm một công cụ dùng để Download các bài hát và video chất lượng cao từ trang phát hành nhạc trực tuyến ZING MP3. Sau bài viết này, mình hy vọng bạn sẽ tự tin và có những ý tưởng tuyệt vời để xây dựng 1 CLI riêng cho bản thân và các dự án.

Điều kiện

  • Mình sử dụng Go với phiên bản 1.12 và sử dụng Go Modules để quản lý các packages.
  • Bạn nên xem qua một chút về thông tin các thư viện đã được đề cập đến bao gồm Cobra, Viper, Prompt UI để dễ thực hiện hơn.

Tổng quan

Ở bài hướng dẫn này, mình sẽ kết hợp 3 thư viện trên để chúng ta có thể xây dựng 1 CLI đơn giản nhưng vẫn có những trải nghiệm tốt nhất định. Để có thể hoàn thành toàn bộ Code, bạn có thể đọc thêm tại Source Code mình chia sẽ ở bên dưới nhé.

  • Cobra: Là một thư viện khá phổ biến để xây dựng một CLI trong Golang.
  • Viper: Một thư viện giúp viết và đọc các nội dung liên quan tới thông số cấu hình trong Golang, hỗ trợ các tệp tin bao gồm: TOML, JSON, YAML,…
  • PromptUI: Một thư viện giúp các nội dung nhập liệu trong CLI của bạn mang tính tương tác hơn.

Source code

Bạn có thể tải về sử dụng thử với phiên bản 1.0 tại đây

Tiến hành xây dựng CLI với Cobra

CLI của bạn sẽ được chạy và điều khiển bởi bộ lõi xử lý của Cobra. Để thực hiện, yêu cầu đầu tiên bạn cần phải khai báo Root Command (Lệnh Root), và để nó chạy tại hàm main() trong package main của project. Ví dụ:

  • cmd/root.go
Cách viết Root Command
  • main.go
Hàm main()

Hàm main() khá đơn giản, tất cả bạn cần làm là gọi hàm Execute() đã được định nghĩa trong Root Command. Và nó sẽ tự thực hiện các công việc còn lại.

Tiếp theo chúng ta sẽ viết 2 lệnh con cho Root Command, bao gồm Download MP3 và Download MP4.

2 lệnh con bao gồm Download MP3 và MP4

Nó khá đơn giản để bạn có thể hiểu được rằng chúng ta chỉ cần tạo 2 lệnh mới và sử dụng chúng tại hàm init() và thêm chúng vào lệnh Root (cha). Sau khi thêm thành công, và chạy chương trình, chúng ta có thể sử dụng bằng cách gọi lần lượt như sau: zmp3 song hoặc zmp3 video. Trong đó zmp3 là cha, song và video là con.

Viết và đọc cấu hình CLI với Viper

Để lưu trữ và đọc được cấu hình về chất lượng muốn tải về cho MP3 và MP4 từ Zing MP3, cũng như là thư mục lưu trữ nội dung sẽ được tải về. Chúng ta sẽ sử dụng Viper để giúp chúng ta lưu trữ cũng như đọc được các thông số cấu hình. Toàn bộ nội dung cần cấu hình sẽ được lưu trong file TOML, tên file mặc định sẽ là “ zingmp3_downloader.toml “.

Tăng tương tác với người dùng bằng PromtpUI

Chúng ta có thể sử dụng PromptUI để làm CLI chúng ta tăng thêm tính tương tác. Chúng ta sẽ tăng tương tác cho việc cài đặt cấu hình mới cho CLI:

  • Thiết lập chất lượng tải về của MP3/MP4 (Kiểu dữ liệu là Integer)
  • Thiết lập tên thư mục chứa file được tải về (Kiểu dữ liệu là String)
Tạo 2 hàm phục vụ nhập Integer và String

Chúng ta quay trở lại file root.go và sẽ thêm 1 cờ để giúp ứng dụng bạn biết là chúng ta muốn thiết lập cấu hình mới.

  • Đặt một cờ (Flag) với kiểu dữ liệu Boolean
var setConfig bool
  • Đặt giá trị mặc định cho cờ bằng cách thêm trong hàm init(), giá trị mặc định sẽ là false, khi người dùng chọn, giá trị sẽ là true như sau:
Thêm vào hàm init()
  • Thêm một chút code vào trong hàm RunE như sau:
Kiểm tra, nếu biến setConfig thay đổi thì thực hiện hàm setNewConfig()

Để thay đổi giá trị của setConfig từ flase thành true, người dùng sẽ phải gọi lệnh như sau: zmp3 -c

Demo

Để cài đặt và sử dụng, chúng ta cần làm như sau:

  • Cài đặt:
go install github.com/ducmeit1/zmp3
  • Các lệnh đang có và được phép sử dụng:
  • Kết quả lúc sử dụng, mình tải MP3 và MP4 của bài hát Sóng Gió thực hiện bởi Jack và K-ICM như sau:
Mình có thêm thanh kiểm tra quá trình tải về cho MP3/MP4
  • File được lưu trữ tại thư mục mặc định là zingmp3 sau khi tải thành công
Kết quả sau khi tải thành công

Hết. Tất cả chỉ có như vậy thôi là chúng ta đã làm được 1 cái CLI đơn giản và cũng rất chi và này nọ rồi đấy.

Cuối cùng, cảm ơn bạn đã quan tâm và theo dõi nhé. Có gì ủng hộ cho mình bài tiếp theo nhé.

--

--