yargs.js ile Komut Satırı Arayüzü (CLI)

Cem Topkaya
4 min readSep 22, 2020

--

Üç tür komut satırı argümanı vardır:

  1. durum (positional) argümanları,
  2. adlandırılmış (named) argümanlar
  3. ve bayraklar (flags).
  • Positional (konumla ilgili, durum) değişkeni, ne yapmak istediğimizi yani eylemi tanımlar.
  • Adlandırılmış bağımsız değişken, bir anahtar, değer çiftidir.
  • Bayrak, varlığı veya yokluğu uygulamaya bilgi sağlayan bağımsız bir anahtardır.

Aşağıdaki rename komutu iki positional değişken alıyor ancak bunun yerine isimlendirilmiş değişkenler ile de komutu yazabiliyoruz.

rename simdikiAdi.txt yeniAdi.txt
rename --eski simdikiAdi.txt --yeni yeniAdi.txt
veya kısa adlarıyla,
çoğu komut - işaret (sigil) kullanır ama -- de olabiliyor
rename -e simdikiAdi.txt -y yeniAdi.txt

Ancak bayraklar (flags) tek başına olup (yani anahtar değer çifti değil) uygulamaya bir bilgi iletmek için kullanılır.

Aşağıdaki örnekte uzun hali --detach olan komut ile docker.exe uygulamasına diyoruz ki; sen konteyner oluştur ama bu terminali oluşturduğun konteynerin terminaline bağlayarak çıktıları canlı görmemi sağlama. --detach Komutunu kısaca -d kullanarak da geçebilirdik docker.exe uygulamasına.

docker run --name=containerAdi --detach ubuntu
veya
docker exec -i --tty --user root containerAdi

Nitekim ikinci örneğimizde -i veya --interactive bayrağı ile kendi konsolumuzda yazdıklarımızı konteynere aktarmasını sağlar. Nitekim terminalimizi konteynerin terminaline bağlyarak konteynerin stdout ve stderr çıktılarını aktif konsolumuzda görmemizi sağlayacak -t ile --tty argümanı da bayrak (flag) olarak kullanıyoruz.

Kaynaklar

  1. İzlemek isterseniz bu youtube videosu faydalı olacaktır.

2. Koç Akademi’nin yayınladığı eğitimde bu ve bu iki video çok işinizi görebilir. (Koç’un sunduğu bu çevrimiçi siteyle sosyal sorumluluğun nasıl bir şey olduğunu anlıyoruz)

Test Aracı

Önce çevrimiçi denemeler için bu adresten başlayabiliriz https://repl.it/@caub/yargs#index.js

repl.it üstünde koşan nodejs uygulamanıza (veya diğer uygulamalara da) argümanlar geçirmek istiyorsanız .replit dosyası oluşturup içine komutlarınızı girebilirsiniz.

language="node"
run="node index.js --arg1 --arg2 --arg3"

Komut Satırını İnceleyelim

Yargs parametreleri komut ve seçenek olarak iki parçaya bölüyor.

  • command
  • option
$ node index service get --sayi 22 -s=33 -s 44 -c "config değeri metin olsun"  --isTlsPassive 0 --ayar-dosyasi-faal true

Yukarıdaki komut en genel anlamda 3 paçadan oluyor:

  • node.exe : interpreter uygulama (node veya node.exe diye yazsak da çalışır)
  • index : ikinci parametre yorumlanacak ve çalıştırılacak dosya index.js (kısaca index yazıyoruz ve node.exe index.js dosyasını buluyor)
  • üçüncü blok ise parametreler service , get , --sayi 22 , -s=33 , -s 44 , -c “config değeri metin olsun” , --isTlsPassive 0 , --ayar-dosyasi-faal true

Yargs Parametreleri Nasıl İşler

Parametreler aşağıdaki şekilde

  • Ya hiç önünde tire olmaksızın (service veya get gibi) (command fonksiyonuyla işleyebileceğiz).
    service ve get parametreleri _ özelliğinde taşınıyor.
  • Ya -- ile (örn. --sayi değeri 22 ) (option fonksiyonuyla işleyebileceğiz)
// Parametre uzun adıyla --sayi veya kısa adıyla -s girilebilir
--sayi 22
--sayi=22
-s=33 // Hem 's=33' hem 's 44' şeklinde girilirse
-s 44 // değerler s özelliğine dizi olarak yazılır [33, 44]
// otomatik string olarak parse ediyor
-c "config değeri metin olsun"
// dikkat! camel case doğrudan kullanılıyor
--isTlsPassive 0

// kebap case girdik hem camel hem kebap case iki özellikte saklıyor
--ayar-dosyasi-faal true
  • Ya da tek tire ile - (örn. -s değeri 33 veya -s=44 ) (option ile ele alacağız)

Başka bir örnek de aşağıdadır:

require(‘yargs’).parse(…)

parse([]) metoduna geçireceğimiz dizi ile tıpkı komut satırından gelmiş gibi ayrıştırabiliriz.

Ornekler

check() Fonksiyonuyla Parametrelerin Denetimi

const yargs = require('yargs')
const fs = require('fs')
yargs.command({
command: 'add',
describe: 'Adds two number',
builder: {
firstNumber: {
describe: 'First Number',
alias:'f',
demandOption: true, // Required
type: 'number'
},
secondNumber: {
describe: 'Second Number',
alias:'s',
demandOption: true,
type: 'number'
}
},

// Function for your command
handler(argv) {
console.log("Result:",
(argv.firstNumber+argv.secondNumber))
}
})
.check((args,opts)=>{
if(isNaN(args.secondNumber))
throw new Error('ikinci deger sayi olmaliydi')
// Buraya kadar sorun yok, handler fonksiyonuna gecebilir
return true
})
.help()
.parse()

bin Özelliği İle Çıkış Komutu Oluşturmak

# mkdir bin_ornegi
# cd bin_ornegi\
# npm init -y
# npm i typescript --save
# npx tsc --init

Oluşan tsconfig.json dosyasında dönüştürülecek kodların ./dist dizinine yazılacağını belirtelim:

{
"compilerOptions": {
/* Visit https://aka.ms/tsc
/* Basic Options */
// "incremental": true,
"target": "es5",
"module": "commonjs",
// "lib": [],
// "allowJs": true,
// "checkJs": true,
// "jsx": "preserve",
// "declaration": true,
// "declarationMap": true,
// "sourceMap": true,
// "outFile": "./",
"outDir": "./dist",
// "rootDir": "./",

Ve typescript compiler’ı çalıştıralım: npx tsc

Kaynaklar:

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet