21 Ağustos 2018 Salı

Go ile Komut Satırı Aracı Oluşturmak

CLI(Command Line Interface) -türkçe olarak ifade edersek komut satırı arayüzü- kullanıcıların komut satırında etkileşimde bulunduğu programdır.
Go standart kütüphanelerini kullanarak komut satırı araçları oluşturmanın basit bir yolunu sunuyor. Go'da bunu yapmanın birden çok yolu vardır ancak bu yazıda genel hatlarıyla flag paketini açıklayacağım.

Parametreleri Ayrıştırma

Ayrıştırma işleminde genel olarak kullanılan üç terim vardır; argümanlar, seçenekler ve bayraklar. Bunlar sıklıkla birbirinin yerine kullanılır.
Go bu terimler konusunda genel tanımlara uymuyor, flag paketi ile bir veya iki tire ile başlayan tüm dizgeleri bayrak olarak, kullanıcı girdisi ve tire olmayan tüm dizgeleri argüman olarak kabul ediyor. 

Flag Paketi

Flag paketi, komut satırı ayrıştırma işlemleri için kullanılan standart kütüphanedir.

Bayrakları, flag.String(), flag.Bool(), flag.Int() kullanılarak tanımlayabiliriz:

import "flag"
var ipPtr = flag.Int("bayrakAdı", 1234, "bayrakAdı için yardım mesajı")
flag.Parse()

ipPtr -bayrakAdı veya --bayrakAdı parametresi ile alınan değere referans gösterecektir. *ipPtr varsayılan değeri 1234'tür.
Bu örnekte flag.Parse() işlevi, komut satırı girişini ayrıştırır ve -bayrakAdı parametresi ile aldığı değeri *ipPtr'a yazar.

Bayrak olarak tanımlananlar birer işaretçilerdir.
Bayrağı Var() işlevi kullanarak bir değişkene bağlayabiliriz:

var ipdegeri int
flag.IntVar(&ipdegeri, "bayrakAdı", 1234, "bayrakAdı için yardım mesajı")
flag.Parse()

Kullanıcıdan aldığı cümlenin kaç kelimeden olduğunu döndüren basit bir go programı üzerinden flag paketini nasıl kullanacağımızı inceleyelim:

package main

import (
    "flag"
    "fmt"
    "os"
    "strings"
)

func main() {
    var cumle string
    flag.StringVar(&cumle, "boyut", "", "Cümlenin boyutunu döndürür.")
    flag.Parse()

    if cumle == "" {
        flag.PrintDefaults()
        os.Exit(1)
    }
    cumleBoyutu := kacKelime(cumle)
    fmt.Printf("Cumlenin kelime sayisi = %d \n", cumleBoyutu)

}

func kacKelime(cumle string) int {
    var kelimeler []string
    kelimeler = strings.Split(cumle, " ")
    return len(kelimeler)
}

Burada varsayılan değeri boş karakter dizgesi olan string türünde bir bayrak tanımlıyoruz. Eğer StringVar kullanıyorsak, değerin yazılacağı değişkenin adresini belirtmeliyiz. Son kısımda da kullanıcılara bu bayrağın ne işe yaradığını anlatmak için kullanım iletisi ekliyoruz.
Eğer kullanıcı herhangi bir parametre girmezse tanımlanan tüm komut satırı parametrelerinin kullanım iletisini yazdırır.
Eğer kullanıcı -boyut parametresi ile bir cümle yazarsa program girilen cümlenin kaç kelime olduğunu dönecektir.
Not: Programda string paketi cümleyi kelimelere bölmek, os paketi ise programın sonlanması için kullanılmıştır.
Son olarak bütün bayraklar tanımlandıktan sonra bayrakların değerlerinin atanması için flag.Parse() öğesini çağırmalıyız.

Help Çıktısı

Komut satırı aracınıza kullanıcıları nasıl çalıştıracağı konusunda yönlendiren bir mesaj eklemelisiniz. flag paketi bayrak oluştururken eklediğimiz kullanım iletilerini birleştirerek yardım metnini oluşturur.
Yardım metnini görüntülemek için:
./komutSatırıBayraklari --help
veya
./komutSatırıBayraklari -h
komutlarını kullanabiliriz.

help çıktısını kendimizde değiştirebiliriz, bunun için flag paketinde Usage işlevi bulunmaktadır.

package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    flag.Usage = func() {
        fmt.Printf("%s programının yardım sayfasıdır.", os.Args[0])
        PrintDefaults()
    }
    flag.Parse()
}

Artık programımızı -h veya --help parametresiyle çalıştırdığımızda Usage ile oluşturduğumuz mesaj yazılacaktır.
Burada program adı yerine os.Args[0] kullanılmıştır çünkü ilk argüman her zaman programın adıdır.

Bir bayrağı zorunlu hale getirmek için:

    cumlePtr := flag.String("b", "", "Cümlenin boyutunu döndürür.(Kullanımı zorunludur.)")
    kontrolPtr := flag.Bool("k", false, "Doğru ya da yanlış değerini alır. Varsayılan değeri false.")
    flag.Parse()
    if *cumlePtr == "" {
        flag.PrintDefaults()
        os.Exit(1)
    }
    fmt.Printf("cumlePtr: %s,  kontrolPtr: %t", *cumlePtr, *kontrolPtr)

Burada -b parametresi olmadan program çalışmayacaktır.

Komut Satırından Çalıştırılabilir Hale Getirmek
$ go build gobayrak.go
Bu komut ile gobayrak adında çalıştırılabilir dosya oluşur.

$ cp gobayrak /usr/local/bin
Bu dosyayı /usr/local/bin dizinine kopyalarak programımızı komut satırından kullanabiliriz.

Hiç yorum yok:

Yorum Gönder