Golang ile CLI Uygulaması Geliştirmek
#Golang, #Go, #Go CLI Application, #Konsol uygulamasıBugün Golang kullanarak bir CLI uygulaması (konsol) nasıl geliştirebileceğimizden bahsedeceğim. Bir konsol uygulaması ne diye soracak olursanız şunları örnek verebiliriz. Systemctl, docker... gibi bir çok örneği mevcuttur.
Golang nedir?
Golang, basit, güvenli ve verimli yazılımlar geliştirmemize olanak tanıyan açık kaynaklı bir programlama dilidir. Google tarafından desteklenmektedir. Derlenebilir bir dil olduğundan yüksek performans sunmaktadır. Paket yönetimi sistemi, hızlı derleme süresi büyük artılarındandır. Derlenen programların çalıştırılması için bir VM'e ihtiyaç duyulmamaktadır. (Java'daki bytecode runner örnek verilebilir)
Yeni bir Golang projesi oluşturmak
Golang kurulumu
Öncelikle sistemimize Go kurulumu yapmamız gerekmektedir. Derleme işlemlerini kendi içindeki araçlar ile yapacağız. Arch Linux’da pacman -S go
, Pardus/Debian üzerinde ise apt install golang
yazarak kurulum işlemlerini gerçekleştirebiliriz. Kurulduğundan emin olmak için ise terminalimizde go version
komutunu çalıştırarak kurulumun gerçekleştiğinden emin olalım.
Yeni proje oluşturmak
Yeni proje oluşturmak için ev dizinimizde go
isimli bir klasör oluşturuyoruz. Ardından içine de src
isimli bir klasör oluşturuyoruz. Bu klasör içerisinde projelerimizi oluşturacağız. İlk aşama olarak src
klasörü içerisinde GitHub hesap isminiz ile klasör oluşturmalısınız. Bu senaryoda benim dogukanoksuz isimli bir klasör oluşturmam gerekmekte. Bu işlemlerin sonunda artık klasörümüz içerisine istediğimiz isimle projelerimizi oluşturabiliriz. Örnek olarak go-cli-application isminde bir klasör açalım ve terminalde bu dizine geçiş yapalım.
$ go mod init github.com/GITHUB_HESAP_ADINIZ/go-cli-application
komutunu çalıştıralım. Bu komut sayesinde projemizde Go paket yöneticisini kullanabileceğiz.
Code eklentisi kurulumu
Eklentiler sekmesinden Go diye arattığımızda bu eklentinin kurulumunu yapıp Quick Start kısmını takip etmeliyiz. İşlemin ardından Go ortamınız otomatik formatlama, hata gösterme ve tamamlama gibi özellikleri alacaktır. Tavsiye ettiğim geliştirme ortamı bu şekildedir.
CLI uygulamasının temellerini atmak
Öncelikle kodlarımızın başlangıç noktası olan main dosyamızı oluşturmamız gerekmektedir. Klasörümüz içerisinde main.go
dosyasını oluşturalım. Ardından içeriği aşağıdaki gibi olmalıdır.
package main
func main() {
// Uygulamamızın başlangıç noktası
}
Şu adımda bir Go projesi oluşturmuş olduk. Eğer bir Hello world mesajı görmek isterseniz fmt.Println("Hello world")
şeklinde çağrımızı yapabiliriz.
Uygulamamızı derlemek için de go run main.go
veya go build
komutlarını çalıştırabiliriz. Ardından klasörümüz içerisinde çalıştırılabilir dosyamız oluşacaktır.
Bu aşamadan sonra bir CLI uygulaması geliştirmek için tüm hazırlıklarımızı tamamladık. Şimdi işimizi kolaylaştıracak bir kütüphane kurulumu yapalım.
spf13/cobra adresinden dokümanını inceleyebileceğimiz Cobra kütüphanesini şu komut ile kuracağız.
$ go get -u github.com/spf13/cobra
komutunu çalıştırarak kütüphanemizi projeye ekleyelim.
Cobra kütüphanesi kullanımı
Argümanların yakalanması, parse edilmesi işlemlerini bizim yerimize kolayca halletmesi için Cobra kütüphanesini kullanacağız.
▾ go-cli-application/
▾ cmd/
buraya.go
komutlarinizi.go
ekleyin.go
root.go
main.go
Klasör yapımız yukarıdaki şekilde olmalıdır. Komutlarımızı cmd
klasörü altında açacağız. main.go
dosyasının içeriğini de aşağıdaki gibi değiştirelim.
package main
import (
"github.com/GITHUB_KULLANICI_ADINIZ/go-cli-application/cmd"
)
func main() {
cmd.Execute()
}
Cobra kütüphanesi artık tüm argümanları yakalayacaktır. Gelin birlikte kök komutumuzu oluşturalım. cmd
klasörü içine root.go
dosyamızı oluşturalım.
package cmd
import (
"fmt"
"os"
"github.com/spf13/cobra"
)
var (
rootCmd = &cobra.Command{
Use: "go-cli-application",
Short: "Example Go CLI Application",
Long: `Example Go CLI Application`,
}
)
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func init() {
rootCmd.CompletionOptions.DisableDefaultCmd = true
}
rootCmd
değişkenimiz içerisinde bir cobra.Command
türünde struct tanımlıyoruz. Bu struct içerisinde uygulamamız çalıştırıldığında yardım sayfasında çıkacak mesajlar vb. düzenlenmektedir.
Execute()
fonksiyonu ise Cobra uygulamamızın çalışmasını sağlayan kod bloğudur.
init
fonksiyonunda da uygulama her çalıştırıldığında yapılacak işlemler tanımlanacaktır.
Gelin bir de ilk komutumuzu ekleyelim.
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(exampleCmd)
}
func example() {
fmt.Println("My example output")
}
var (
exampleCmd = &cobra.Command{
Use: "example",
Short: "Example command",
Long: "Example command",
Run: func(cmd *cobra.Command, args []string) {
example()
},
}
)
Yukarıda görüldüğü üzere exampleCmd
değişkeninin içeriğine bir de Run
diye bir anahtar ekledik. Bu Run anahtarı komut çalıştırıldığında yürütülecek fonksiyon(ları) eklediğimiz ve argümanları yakaladığımız kısım. Ben örnek olarak example fonksiyonunu çağırmasını istedim.
Example fonksiyonunda ise "My example output" diye bir çıktı verdim.
Ardından komutun Cobra sistemine eklenebilmesi için init
fonksiyonum içinde rootCmd
içerisine addCommand
fonksiyonunu kullanarak ekledim.
Şimdi denemek için go build
komutunu çalıştırıyorum ve klasörümüz içerisinde go-cli-application
diye bir çalıştırılabilir dosya oluştu. Bu dosyayı çalıştırdığımda yardım sayfası görünecek, go-cli-application example
diye çalıştırdığımızda ise fonksiyonumuz çalışacaktır.
Temel olarak bir Go CLI uygulaması bu şekilde oluşturulabilir. Geri kalanı sizin yaratıcılığınıza kalmış, ister veritabanına bağlanıp çeşitli sorgular çalıştıran bir uygulama, isterseniz sistem dosyalarını değiştiren bir program yazabilirsiniz.
Sorularınız için yorum bölümünü kullanabilirsiniz. İyi çalışmalar dilerim :)