Loader

Golang ile CLI Uygulaması Geliştirmek

· Golang ·
Golang, Go, Go CLI Application, Konsol uygulaması

Golang

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.

Golang VSCode Extension

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.

Golang Hello World

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 :)

Daha fazla gönderi...