- Rapor oluşturma uygulaması geliştirme sürecinde, çalıştırma sonucunu simüle edebilmek için
--dry-run seçeneğinin eklendiği bir örnek
- Bu seçenek, gerçek bir değişiklik yapmadan hangi işlemlerin gerçekleştirileceğini çıktılar; böylece güvenli test ve hızlı geri bildirim sağlar
- Geliştirici bunu kullanarak yapılandırmayı, erişilebilirliği ve sistem durumunu anında kontrol eder ve günlük doğrulama aracı olarak kullanır
- Kod içinde
dryRun bayrağını kontrol etme gerekliliği, bir miktar ek karmaşıklık olarak dezavantaj şeklinde belirtilir
- Komut temelli uygulamalarda
--dry-run işlevi çok kullanışlıdır ve projeye ne kadar erken eklenirse geliştirme verimliliği o kadar artar
Arka plan
- Yeni geliştirilen rapor oluşturma uygulaması, her iş gününde rapor üretir, bunları sıkıştırıp bir sftp sunucusuna yükler, hata yanıtlarını kontrol eder ve bildirim e-postası gönderir
- Her adımda üretilen dosyalar ve geri bildirim dosyaları, aşamaya göre farklı dizinlere taşınır
- Geliştirmenin başında, Subversion ve çeşitli Linux komutlarındaki
--dry-run seçeneği hatırlanarak aynı işlev eklendi
- Bu seçenek, gerçek değişiklik olmadan çalıştırıldığında neler olacağını çıktılar
--dry-run çalıştırıldığında, oluşturulacak ve hariç tutulacak raporlar, sıkıştırılacak ve taşınacak dosyalar, ayrıca sftp ile yüklenecek ve indirilecek dosyalar adım adım gösterilir
Kullanım ve faydalar
- Geliştirme ve test sürecinde her gün kullanılacak kadar faydalı bir işlev
- Çalıştırmadan önce durum kontrolü amacıyla kullanıldığında, yapılandırma, erişilebilirlik ve sistem durumu anında doğrulanabilir
- Gerçek değişiklik olmadığı için güvenle çalıştırılabilir
- Rapor durum dosyasındaki tarih değiştirildikten sonra, ilgili raporun oluşturulup oluşturulmayacağı hemen kontrol edilebilir
- Gerçek rapor üretimi zaman alabilir, ancak dry-run hızlı geri bildirim sağlar
- Tüm sistemi test ederken de hızlı bir doğrulama döngüsü sunar
Dezavantajlar
- Kod içinde
dryRun bayrağını tekrar tekrar kontrol etmek gerektiği için bir miktar kod kirliliği oluşur
- Ana adımların her birinde bayrak kontrol edilerek gerçek çalıştırma yerine yalnızca log çıktısı verilir
- Ancak bu kontrol derinlemesine değildir ve rapor oluşturma mantığının içinde ayrı bir işleme gerek yoktur
- Yalnızca çalıştırılıp çalıştırılmayacağına karar veren üst seviyedeki adımlarda kontrol edilir
Sonuç
- Komutla çalıştırılan ve çıktı üreten uygulamalar
--dry-run seçeneğiyle iyi uyum sağlar
- Buna karşılık, mesaj bekleyen reaktif uygulamalar için uygun değildir
- Projenin başında eklenmiş olması, geliştirme verimliliğini artırmada büyük fayda sağlamıştır
- Her durumda gerekli bir özellik değildir, ancak uygun koşullarda çok yararlı bir araç olarak değerlendirilir
1 yorum
Hacker News görüşleri
Durum tutan sistemlerle etkileşirken
--dry-runiçinde de race condition oluşabilirAraç, mevcut duruma göre “ne yapacağını” gösterir, ancak gerçek çalıştırma anında koşullar değişmiş olabilir
Bu yüzden ben Terraform’un “plan” modu yaklaşımını tercih ediyorum. Bu mod, yürütülebilir bir plan üretir ve plan anındaki varsayımlar değişirse durabilir ya da rollback yapabilir
Ayrıca kodun her yerine
if dry_run:eklemek gerekmez; planlama ve yürütmeyi ayırıpexecute(plan())biçimine sadeleştirebilirsinizDNS Planner ile Enactor arasındaki zamanlama sorunu nedeniyle eski bir planın en güncel planın üzerine yazılması yaşanmıştı
Konu önceki HN başlığında da ele alınmıştı
Çünkü plan modu kurmak için alan özelinde bir dil ya da veri yapısı gerekir
(1) Dosya sistemi durumunu yakalayıp planı kaydet → (2) durumun değişmediğini doğrulayıp çalıştır ve log tut → (3) önceki durumla karşılaştırıp veri kaybı olup olmadığını doğrula
Bu üç adımı ayrı betikler ya da bayraklar olarak kullanıyorum
rmkomutuna böyle bir plan modunun nasıl uygulanabileceğini merak ediyorumBir araçta
--dry-runyoksa bazen kendim oluşturuyorumÖrneğin karmaşık bir
sedkomutunu çalıştırmadan önce,diffile değişiklikleri önceden karşılaştırıyorumdiff -u <(echo "hello") <(echo "hello" | sed "s/hello/hi/g")gibi bir yöntemle farkı görebiliyorsunuzİlgili yazıları blogumda topladım
--dry-runkalıbını seviyorum, ama dry yolundaki kodun gerçek yol ile aynı davranması gerekiyorSadece “şunu yapacağım” deyip gerçek mantığı atlamak, gerçek çalıştırmada hataların gözden kaçmasına neden olabilir
Veritabanı yazımı ya da API çağrısı anına kadar aynı şekilde ilerlemeli
Dry-run, “ne olacağını” göstermek içindir; gerçek test ise ayrı bir alandır
Ben tersine
--commitya da--executebayrağı koyup, varsayılan çalıştırmayı salt okunur (dry) bırakmayı tercih ediyorumBöylece yanlışlıkla gerçek değişiklik yapma ihtimali azalıyor
--commitaçıkça verildiğinde değişiklik yapıldığı için güvenli olduBuna karşılık
--dry-runvermeyi unutup sorun yaşadığım çok olduVarsayılan olarak sadece karşılaştırma yapıyor; gerçek hardlink değiştirmesi için
--executegerekiyorBöyle onay adımları hataları azaltmada etkili oluyor
--wet-rungibi bir bayrağı da seviyorum. Bazen bağlama göre ters anlamlı bayrak daha sezgisel olabiliyorDELETE-ACCOUNTyazmak gerekiyorŞimdiye kadar yanlışlıkla tek bir hesabı bile silmedim
Kodun kirlenmesini önlemek için kalıcılığı (persistence) enjekte edilebilir bir strateji olarak ayırmak gerekir
Kodun her yerine
if dry_run:serpiştirmek iyi değilHatta production çalıştırmayı
--wet-runile açıkça belirtmek daha güvenli olabilirBöylece dry-run kararını yalnızca tek bir yerde vermek mümkün olur — “functional core, imperative shell” tarzında
rm --wet-run tempfile.tmpyazmak zahmetli olurVarsayılanın gerçek çalıştırma olması, bunun yerine son işlemi geri alan bir
--undoseçeneği olması daha iyi olurdu--wet-runadı hoşuma gitmese de, varsayılanı dry-run yapıp değişiklik için--no-dry-runzorunlu kılan bir yaklaşımı da kullandımBir servis söz konusuysa, çalıştırma ortamına göre (dev/prod) güvenli modu otomatik seçmek ideal olur
Yazıda “başta
--dry-runekledim, ama beklenmedik şekilde faydalı oldu” denmişti,aslında bu tür bayrakları yapay zeka kodlama ajanları (ör. Claude) sıkça otomatik öneriyor
Bugün birçok CLI aracında benzer kalıpların görülmesinin nedeni, bu tür ajan kaynaklı kod yakınsaması da olabilir
--dry-runseçeneğinden ilham aldığını açıkça belirtmiş olması da gayet ikna edici bir gerekçeBen CLI yardımcı programlarına
--reallybayrağı ekleyip varsayılanı salt okunur bırakıyorumAmaç, hataları önlemek için bilinçli bir onay adımı gerektirmek
--i-meant-thatbayrağı olan bir komut da vardıUzak bir makineyi silen bu komut, varsayılan olarak 10 saniye bekleyip iptal etme fırsatı veriyordu
Neyse ki bu bayrak hiç yanlış kullanılmadı
PowerShell’in güzel yanlarından biri,
[CmdletBinding(SupportsShouldProcess)]satırını ekleyince-WhatIfdry-run özelliğinin otomatik olarak kullanılabilmesiBu gerçekten çok kullanışlı bir özellik
-Confirmda birlikte etkinleşiyor veShouldProcessişleviyle kullanıcının onay eşiği ile etkileşim kurulabiliyor. Gerçekten çok şık bir tasarımYönettiğim dahili CLI’de
if not dry_run:koşulunu REST API çağrılarının içine koyuyorumBöylece gerçek çağrı yerine, hangi isteğin gönderileceğini görmek için CURL komutu logu bırakabiliyorum
Ancak API’ler arası etkileşim karmaşıklaştıkça simülasyon zorlaşıyor ve bu yapı basit bir
if not dry_run:yaklaşımından çok daha karmaşık hale geliyorBen de otomasyon pipeline’ları için birçok CLI’nin bakımını yapıyorum ve bu deseni neredeyse tüm araçlara uyguluyorum
Önce yerel aracı doğru yapmak gerektiğini savunuyorlar
Eğer
--dry-runbayrağı kod tabanının her yanına dağılmışsa, durum makinesi deseni uygulayıp her aşamayı net biçimde ayırmak iyi olur