🐍Cobra CLI
Last updated
Last updated
Cobra, basit arayüzlü komut satırı uygulamaları oluşturmanız için güçlü bir pakettir. CLI uygulamanızı kolaylıkla oluşturabilmeniz için aynı zamanda oluşturucu bir cli aracıdır.
Özellikler:
Kolay alt-komut (subcommand) yapısında cli uygulamaları: app server
, app fetch
gibi,
Tamamen POSIX uyumlu flag'ler (kısa ve uzun versiyonları ile),
İç içe alt-komutlar,
Global, yerel ve cascading (basamaklı) flag'ler,
cobra init appname
ve cobra add cmdname
gibi komutlarla kolayca yapı oluşturma,
Akıllı öneriler (app servr
... did you mean app server
?)
Komutlar ve flag'ler için otomatik yardım oluşturma
Otomatik help flag tanımlaması -h
ve --help
Otomatik shell auto-completion oluşturma (bash-zsh-fish-powershell)
Otomatik manual sayfası oluşturma
Komut alias'ları
Kendi yardım ve kullanım bilgilerini tanımlama esnekliği
go get -u github.com/spf13/cobra@latest
go install github.com/spf13/cobra@latest
Proje klasörümüzü oluşturduktan sonra,
cobra-cli
aracının çalışması için proje klasörümüzün içerisinde eğer go modules
kurulmamışsa go mod init <isim>
komutunu çalıştırmamız gerekiyor.
cobra-cli init uygulamam
veya bulunduğunuz dizinde oluşturmak için uygulamam
yerine .
(nokta) kullanabilirsiniz.
Bu komuttan sonra aşağıdaki gibi klasör ve dosya yapısı oluşacaktır.
Oluşturulan yapıyı incelediğimizde, main.go
dosyamız basitçe aşağıdaki gibi görünür.
import kısmındaki cobra-cli-example
, go module'daki belirlediğimiz isim olduğundan sizde farklı görünecektir. main()
fonksiyonu içerisinde alt-paketimiz olan cmd
içerisindeki Execute()
fonksiyonunu çalıştırıyor. Varsayılan kullanımda tüm flag'ler ve sub-command'ler vs. bu fonksiyonun çalışmasıyla yüklenecek.
cmd klasörünün içerisine baktığımızda, burada root.go
isimli dosyamızı görüyoruz. Bu dosyamızın içerisinde cli uygulamamız başlatıldığında herhangi bir komut girilmemiş ise gerçekleşecek işlemleri bulundurabiliriz.
Örnek olarak komut satırı kullanımında;
./cobra-cli-example
veya
go run .
root.go
dosyasını inceleyelim.
Bu uygulamayı go run .
komutu ile başlattığınızda, aşağıdaki gibi bir sonuç alırsınız.
Varsayılan olarak rootCmd
altındaki Long
içerisinde yazdığımız açıklama metni görünür.
Uygulamamız çalıştığında bir işlem gerçekleştirmek istiyorsak, aşağıdaki gibi yapabiliriz.
root.go
dosyası içerisinde rootRun
isminde bir fonsiyon oluşturalım.
Bu fonksiyonumuzun çalıştırılması için oluşturduğumuz rootCmd
nesnesine ekleyelim.
5. satırda Run
alanına çalıştırmak istediğimiz fonksiyonu yazdık.
Uygulamamızı başlattığımızda aşağıdaki gibi bir çıktı ile karşılaşacağız.
Böylece rootCmd
uzun bilgilendirme metnini görüntülemek yerine artık istediğimiz işlemi yapıyor.
Eğer bilgilendirme metnini veya yardım metinlerini görmek istersek, -- help
veya -h
flag'lerini kullanabiliriz.
Oluşturduğumuz uygulamayı yüklemek için build edebilir veya go install
komutu ile yükleyebilirsiniz.
go install
ile yükledikten sonra komut bulunamıyorsa, ~/go/bin
klasörünü path
'e eklemeyi deneyebilirsiniz.
Komut eklemek için tekrardan cobra-cli
aracından faydalanabiliriz. Bunun için;
Bu komut sonrası cmd
klasörümüzün içerisinde komuta verdiğimiz isim olan gopher
isminde bir go
dosyası oluşturulduğunuz göreceksiniz.
Bu dosyayı inceleyelim. Aşağıdaki kodlarda sadeleştirilmiş halini göreceksiniz.
Yukarıdaki örnekte run
fonksiyonunu direkt olarak gopherCmd
içerisinde yazdık. Zaten varsayılan olarak oluşturulduğunda burada yazıyor. Kod düzenini sağlamak için eğer uzun satırlı bir fonksiyon olacaksa ayrı bir yerde yazılması tavsiye edilir.
Aşağıdaki komutla bu işlemi de deneyebiliriz.
Yukarıdaki gopher komutuna bir alt komut eklemek istersek, aşağıdaki yöntemi uygulamalıyız.
Öncelikle cobra-cli
aracı üzerinden bir komut ekleyelim.
cmd
içerisindeki alt.go
dosyasında yapmamız gereken tek şey hangi komuta alt komut olarak vereceğimizi belirtmektir. Varsayılan olarak eklenen tüm komutlar rootCmd
'ye eklenir. İstersek bu komutu gopher
komutuna alt komut olarak ekleyebiliriz. Bunun için alt.go
dosyasındaki init()
fonksiyonuna bakabiliriz.
Bu bölümü aşağıdaki gibi değiştirelim.
Bu değişiklikleri gözlemlemek için aşağıdaki komutu deneyebiliriz.
Argümanlar komutların yanına girilen, string
olarak okunabilen değerlerdir.
Argümanları okuyabilmek için kullanacağımız komutun bir alt-komutu olmaması gerekir.
Örnek olarak root
komut üzerinden bir argüman okuyalım.
Bu yapıya göre aşağıdak şekilde uygulamamızı deneyelim.
Eğer root
komutuna bir alt-komut ekli olsaydı, Kaan
isimli bir komutun olmadığını gösteren bir hata alacaktık.
Bu yüzden argümanlarımızı sadece alt-komut içermeyen komutlar üzerinden okumalıyız.
Flag'leri kullanarak cli uygulamamızı kullanan kullanıcılara seçenekler sunabiliriz. Bir flag eklemek için birden fazla yöntem vardır. İlke olarak flag'imizde ayarlanacak değeri kaydetmek için bir değişken oluşturalım ve aşağıdaki gibi bir yapı kuralım. Bu flag'imizi root
komutuna ekleyeceğiz.
Diğer alanlar üzerinden de kullanabilmemiz için değişkenimizi global olarak tanımlayalım.
Flag'i eklemek için root.go
içerisinde init()
fonksiyonuna ekleme yapalım.
StringVarP()
fonksiyonu ile pointer kullanarak oluşturduğumuz değişkenin adresine komut satırından aldığımız değeri atayabiliriz. Bu flag'i aşağıdaki gibi kullanabiliriz.
rootCmd
'nin Run
alanına bağladığımız fonksiyon içerisinde kullanalım.
Aşağıdaki komut ile uygulamamızı deneyebiliriz.
Yukarıdakinden farklı olarak başka kullanım şekilleri de vardır.
go run . -i Kaan
go run . --isim=Kaan
go run . --i=Kaan
Aslında gördüğünüz gibi tamamen posix bir cli uygulaması olarak çalışıyor.
Eğer isim
flag'ini belirtmeden başlatılırsa varsayılan değer olarak verdiğimiz "Ahmet" kullanılacaktır.
Flag'i ekledikten sonra yardım komutunu çalıştırdığımızda aşağıdaki gibi bir çıktı alırız.
Yukarıda gördüğümüz gibi her komut veya flag eklediğimizde bilgilendirmesi yardım alanında görünür.
Eğer kullanacağımız flag sadece uzun flag kullanımı içerecekse StringVar()
fonksiyonunu kullanabiliriz.
Eğer flag'in bir değer dönmesini istersek, yani işaretçisiz kullanımı için, String()
fonksiyonunu kullanabiliriz.
Değer dönme ile beraber uzun flag ile kullanmak istersek, StringP()
fonksiyonunu kullanabiliriz.
Yukarıda gördüğümüz yöntemler ile daha farklı veri tipleri için kullanım senaryoları oluşturabiliriz.
Sadece fonksiyon ismindeki String
yerine kullanmak istediğiniz veri tipini yazmanız yeterlidir.
Kalıcı flag'ler üst komutlara eklendiğinde alt komutlar üzerinde de kullanılabilir.
Aşağıdaki örnekte kalıcı flag'imizi root komuta ekleyip gopher komut üzerinde de kullanmayı göreceğiz.
Yukarıdaki örnekte flag'in alt komutlar üzerinde de çalışması için, diğer örneklerin aksine Flags()
yerine PersistentFlags()
fonksiyonunu kullandık. Uygulamamızı deneyelim.
Böylelikle isim
flag'inden gelen değeri de okuyabildik. Bu yöntem dışında yapıldığında, flag'in geçersiz olduğuna dair hata verecektir.
Bir komut altındaki bir flag'i zorunlu kılmak için MarkFlagRequired()
fonksiyonunu kullanabiliriz.
Uygulamamızı isim
flag'ini girmeden başlattığımızda aşağıdaki gibi bir hata alacağız.
Uygulamanın --version
flag'i ile versiyonunun gösterilmesi için, rootCmd
nesnesi tanımlanırken Version
alanı içerisine versiyonu bildiren bir numara yazabiliriz. Örnek olarak:
6. satırda uygulamanın versiyonunu belirttik. Uygulama üzerinde deneyelim.
Uygulamamızda kullanılan bir alt komutu, yani root
olmayan diğer komutları, kaldırmak yerine bu komutların eskide kaldığını kullancılara bildirebiliriz. Bunun için kullanımdan kaldıracağımız komutu aşağıdaki gibi bir ekleme yapabiliriz.
Depracated
alanına string tipinde bir açıklama yapabiliriz. Deprecated
komutlar çalışmaya devam eder. Uygulamamızı deneyelim.