Tạo tool cli đơn giản với golang

January 22, 2019
go-cli Golang

Golang là một ngôn ngữ mới được phát minh từ Google, cú pháp đơn giản tuy nhiên sức mạnh của nó thì vô cùng vượt trội, Nếu thành thục bạn có thể tạo ra 1 ứng dụng nó vô cùng mạnh mẽ. Ở bài viết này mình sẽ hướng dẫn tạo ra 1 tool cli đơn giản theo hướng package các bạn có thể tùy biến nó và xây dựng project của mình.

Instance Cli

vì viết theo hướng package nên mình sẽ viêt 1 đối tượng để từ đó có thể tạo ra nhiều instance.

Đầu tiên hãy khởi tạo 1 struct

type Cli struct {
    Name     string
    Version  string
    Usage    string
    Commands []Command
    Options  []Option
}

Struct trên là các thuộc tính trong tool của mình mọi người có thể thấy có thuộc tính CommandOption đây chính là các tham số truyền vào trong tool cli. tùy theo các command hay option truyền vào tool có thể chạy theo ý muốn của các bạn. Mình khai báo struct command và option như sau

Command

type Command struct {
    Name     string
    Usage    string
    Options  []Option
}

Option

type Option struct {
    Name     string
    Usage    string
    Variable bool
}

Để tạo ra được 1 instance cli bạn sẽ cần tới 1 function như sau


func New(name string) *Cli {
    if name == "" {
        panic("can't construct an app without a name")
    }
    c := &Cli{Name: name}
    return c
}

function trên của mình nhận biến truyền vào là 1 string nó chính là tên mà tool của bạn sẽ viết. ở đây mình có khởi tạo giá trị từ struct cli bên trên đã viết. c := &Cli{Name: name}

Như vậy là bạn đã init được 1 instance với tool cli đơn giản.

Sử dụng flag xây dựng command

Các cú pháp trên mới chỉ tạo ra được các thông tin cho tool của bạn tuy nhiên nó chưa xử lý gì cả. để làm được việc đó các bạn cần phải thêm method điều khiển nó nữa. Mình viết 1 method run() như sau

func (c *Cli) Run() {
    flag.Parse()

    if len(flag.Args()) < 1 {
        panic("shell-provided arguments are not present")
    }

    switch flag.Args()[0] {
    case "print":
        fmt.Println("Hello world!")
    default:
        log.Fatalf("\nInvalid Command %s", os.Args[1])
    }

    return
}

Như vậy nếu bạn truyền argument print vào thì nó sẽ ngay lập tức in ra màn hình dòng chữ Hello world!

Khởi chạy ứng dụng

Để tạo ra 1 ứng dụng được instance từ struct cli trên các bạn cần phải viết 1 file khác ở đây mình sẽ tạo ra 1 file your-app.go với nội dung như sau

package main

import (
    cli "...cli"
)

func main() {
    cmd := cli.New("your-app")
    cmd.Version = "1.0.0"
    cmd.Usage = "[command] [-option]"
    cmd.Run()
}

Như vậy bạn đã tạo ra được 1 tool với tên là your-app hãy sử dụng go build your-app.go golang sẽ build cho bạn 1 file binary your-app. vậy là xong bạn đã có 1 tool cli đơn giản và có thể vất nó lên bất kỳ hệ điều hành nào kể cả win hay macos. Nếu muốn tạo 1 apt-get cho linux bạn cũng có thể tham khảo link https://help.launchpad.net/Packaging/PPA để quẳng ứng dụng của mình lên đó hoặc ném nó vào đường dẫn /usr/local/bin/ cuối cùng bạn chỉ cần chạy command.

$ your-app print

## output
Hello world!

Bài viết này chủ yếu để làm quen với các cú pháp trong go và hướng package đơn giản, bài sau mình sẽ viết hướng dẫn chi tiết hơn về cách chia cấu trúc và xử lý các command phức tạp. Cám ơn các bạn đã đọc bài hi vọng bài viết mang lại tới nhiều điều bổ ích.