Husky'den Yararlanmak: Kaliteli Kod İçin Git Hooks'a Kapsamlı Bir Rehber

Rind Devran Tukan
Rind Devran Tukan
5 dakika okuma
AI generated image for husky as precommit hook

Husky: Kod Kaliteniz İçin İlk Savunma Hattınız

Yazılım geliştirmenin hızlı dünyasında, kod kalitesini korumak tartışılmaz bir gerekliliktir. Ancak, en disiplinli ekipler bile, gözetim, sıkı teslim tarihleri veya tutarsız süreçler nedeniyle hatalı kodu birleştirme tuzağına düşebilir. Husky ile tanışın; ön commit kancalarını uygulayarak ilk savunma hattınız olarak görev yapan hafif ancak güçlü bir araç. Husky'yi iş akışınıza entegre ederek, değişiklikler commit edilmeden önce kod kalitesi kontrollerinin otomatik olarak çalışmasını sağlarsınız, sorunları erken yakalarsınız ve ekibinizin sayısız hata ayıklama ve yeniden çalışma saatlerinden tasarruf edersiniz.

Neden Ön Commit Kancaları Önemli?

Ön commit kancaları, bir commit tamamlanmadan önce yürütülen komut dosyalarıdır. Sorunlu kodun deponuza girmesini engelleyen birer kapı bekçisi görevi görürler. Onlar olmadan, geliştiriciler test edilmemiş, biçimlendirilmemiş veya hatta bozuk kodu gönderebilirler; bu da entegrasyon sorunlarına ve teknik borca yol açar. Husky, bu kancaların kurulumunu basitleştirerek, aşağıdaki gibi en iyi uygulamaları uygulamayı zahmetsiz hale getirir:

  • Linting: Kod stili ihlallerini otomatik olarak kontrol edin (örneğin, ESLint, Prettier).
  • Test Etme: Regresyonları erken yakalamak için birim testleri veya statik analiz çalıştırın.
  • Güvenlik Taramaları: Üretime ulaşmadan önce güvenlik açıklarını tespit edin.
  • Özel Kurallar: Ekibe özel kuralları uygulayın (örneğin, commit mesajı formatları).

Husky İş Başında: Pratik Bir Örnek

Husky'yi kurmak basittir. npm veya yarn aracılığıyla kurduktan sonra, package.json dosyasında veya özel bir .husky dizininde kancaları tanımlarsınız. Örneğin:

{
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint && npm test"
    }
  }
}

Bu yapılandırma, her commit'in bir lint kontrolünü ve test paketi yürütmesini tetiklemesini sağlar. Herhangi biri başarısız olursa, commit engellenir; bu da yalnızca temiz, işlevsel kodun ilerlemesini garanti eder. Husky'nin güzelliği, esnekliğinde yatar; kancaları ekibinizin ihtiyaçlarına göre uyarlayabilirsiniz, ister TypeScript kontrollerini, Dockerfile doğrulamasını, ister hatta CI/CD ardışık düzen ön koşullarını zorunlu tutuyor olun.

Temel Bilgilerin Ötesinde: Gelişmiş Kullanım Durumları

Husky sadece linting ve test için değildir. Gelişmiş ekipler bunu aşağıdaki amaçlarla kullanır:

  • Şube Koruması: Commit'leri belirli şubelerle sınırlayın (örneğin, yalnızca PR'ler aracılığıyla main'e birleştirmelere izin verin).
  • Bağımlılık Kontrolleri: Commit'lerden önce paket sürümlerini veya lisans uyumluluğunu doğrulayın.
  • Belgeleme Güncellemeleri: README'lerin veya API belgelerinin kod değişiklikleriyle senkronize kalmasını sağlayın.

Bu kontrolleri commit sürecine yerleştirerek, Husky kalite kontrolünü sola kaydırır ve geliştirmenin sonraki aşamalarındaki darboğazları azaltır. Sonuç? Daha hızlı, daha güvenilir sürümler ve hesap verebilirlik kültürü.

Yazılımın baş döndürücü bir hızla ilerlediği bir çağda, Husky bir araçtan daha fazlasıdır; bir zihniyettir. Sorunlara tepki vermek yerine, kod tabanınızı proaktif olarak korumakla ilgilidir. Ön commit kancaları kullanmıyorsanız, kaliteyi şansa bırakıyorsunuz demektir. Husky ile bunu iş akışınızın vazgeçilmez bir parçası haline getiriyorsunuz.

Ön-commit hook'larına gelince, Husky köklü bir favori, ancak oyundaki tek oyuncu değil. Geliştiriciler ayrıca değişiklikler commit edilmeden önce kod kalitesini zorlamak için Lefthook, pre-commit.ci ve diğer araçlara da yöneliyor. Her birinin güçlü yönleri var ve en iyi seçim iş akışınıza, takım büyüklüğünüze ve proje gereksinimlerinize bağlıdır.

Husky: Git Hook Güç Merkezi

Husky, basitliği ve derin Git entegrasyonu nedeniyle birçok kişi için hala ilk tercih. Hafif, yapılandırması kolay ve aşamalı dosya özelindeki kontroller için lint-staged ile sorunsuz çalışır. Husky'nin gücü, esnekliğinde yatar—ister testler çalıştırmanız, ister kodu biçimlendirmeniz veya commit mesajı kurallarını uygulamanız gereksin, bunu minimum ek yükle halleder.

Lefthook: Modern Alternatif

Lefthook, daha modern, özellik açısından zengin bir alternatif olarak ilgi görüyor. Kabuk komut dosyalarına dayanan Husky'nin aksine, Lefthook, daha sürdürülebilir ve hata ayıklaması daha kolay hale getiren bildirimsel bir YAML yapılandırması kullanır. Ayrıca, iş akışlarını önemli ölçüde hızlandırabilen paralel yürütmeyi de destekler. Ancak, öğrenme eğrisi biraz daha diktir ve Husky'nin ekosistem entegrasyonlarının bazıları eksiktir.

pre-commit.ci: Bulut Tabanlı Seçenek

Bulut tabanlı bir çözümü tercih eden ekipler için, pre-commit.ci ilginç bir seçimdir. Ön-commit hook'larını bir CI ortamında çalıştırarak, tüm geliştiricilerin makinelerinde tutarlılık sağlar. Bu, "bende çalışıyor" sorununu ortadan kaldırır, ancak harici hizmetlere bir bağımlılık getirir. Yerel esneklik yerine standardizasyona öncelik veren ekipler için idealdir.

Doğru Seçimi Yapmak

En iyi araç ihtiyaçlarınıza bağlıdır:

  • Husky, geniş ekosistem desteğiyle hafif, Git tabanlı bir çözüm isteyen ekipler için en iyisidir.
  • Lefthook, bildirimsel yapılandırmaları tercih eden ve paralel yürütme gibi gelişmiş özelliklere ihtiyaç duyan ekiplere uygundur.
  • pre-commit.ci, dağıtık ekiplerde tutarlılığı sağlamak için idealdir, ancak CI entegrasyonu gerektirir.

Sonuç olarak, Husky güçlü bir rakip olmaya devam ediyor, ancak alternatifleri keşfetmek, kaçırmış olabileceğiniz iş akışı optimizasyonlarını ortaya çıkarabilir.

Gelişmiş Husky Yapılandırması: Karmaşık Senaryolarda Uzmanlaşmak

Husky, Git hook'larını yönetmek için güçlü bir araçtır, ancak gerçek potansiyeli karmaşık iş akışlarında parlar. Temel linting ve testin ötesinde, gelişmiş yapılandırmalar ekip standartlarını zorlayabilir, CI/CD işlem hatlarını optimize edebilir ve hatta harici hizmetlerle entegre olabilir. İşte Husky'yi gelişmiş kullanım durumları için nasıl kullanacağınız.

Koşullu Hook Yürütme

Her hook'un her commit'te çalışması gerekmez. Hook'ları koşullu olarak yürütmek için --no-verify işaretlerini veya ortam değişkenlerini kullanın. Örneğin:

  • Belirli dallar için hook'ları atlayın: Belirli kontrollerden main veya release dallarını hariç tutmak için git rev-parse --abbrev-ref HEAD komutunu kontrol edin.
  • Dinamik hook mantığı: Hook'ları çalıştırmadan önce koşulları değerlendirmek için shell betikleri veya Node.js kullanın (örneğin, yalnızca dokümantasyon dosyaları değiştiyse testleri atlayın).

Performans için Hook'ları Paralelleştirme

Uzun süren hook'lar geliştirmeyi yavaşlatabilir. Husky v8+, husky.config.js dosyanızda parallel aracılığıyla paralel yürütmeyi destekler:

module.exports = {
  hooks: {
    "pre-commit": {
      parallel: ["lint", "test:unit", "test:e2e"],
    },
  },
};

Bu, bağımsız görevleri eşzamanlı olarak çalıştırarak bekleme süresini azaltır. CPU yoğun görevler için, kaynak çekişmesini önlemek için paralelliği sınırlayın.

Harici Hizmetlerle Entegrasyon

Husky, API çağrılarını veya dağıtımları tetikleyebilir. Örneğin:

  • Güvenlik taramaları: Güvenlik açıkları olan commit'leri engellemek için pre-push hook'unda npm run security-scan komutunu çalıştırın.
  • Otomatik dağıtımlar: Commit mesajı [deploy] içeriyorsa, hazırlık ortamına dağıtmak için bir post-commit hook'u kullanın.

Hassas kimlik bilgilerini ortam değişkenlerinde veya bir sır yöneticisinde saklayın, asla hook betiğinde değil.

Hata Ayıklama ve Bakım

Gelişmiş hook'lar sağlam hata işleme gerektirir. Hata ayıklama için çıktıyı bir dosyaya kaydedin ve hızlı başarısız olmak için shell betiklerinde set -e kullanın. Hook'ları yerel olarak şu komutla test edin:

npx husky run pre-commit

Ekipler için, sürprizlerden kaçınmak için hook davranışını bir CONTRIBUTING.md dosyasında belgelendirin.

Bu tekniklerde uzmanlaşarak, Husky bir linting aracından daha fazlası haline gelir—kod kalitesi, güvenlik ve iş akışı verimliliği için bir kapı bekçisidir.

Sık Karşılaşılan Husky Sorunlarını Giderme

Husky, Git hook'larını yönetmek için güçlü bir araçtır, ancak herhangi bir bağımlılık gibi, zaman zaman zorluklar çıkarabilir. İster ilk kez pre-commit hook'ları kuruyor olun, ister mevcut bir iş akışında hata ayıklıyor olun, yaygın tuzakları anlamak size zaman ve hayal kırıklığı kazandıracaktır. Aşağıda, sık karşılaşılan sorunları ele alıyor ve uygulanabilir çözümler sunuyoruz.

1. Hook'lar Tetiklenmiyor

Husky hook'larınız beklendiği gibi çalışmıyorsa, kurulumu ve yapılandırmayı doğrulayarak başlayın:

  • Husky'nin sürümünü kontrol edin: Git istemcinizle uyumlu bir sürüm kullandığınızdan emin olun. Onaylamak için husky --version komutunu çalıştırın.
  • Hook dosyasını doğrulayın: Hook script'inin .husky/ dizininde bulunduğunu ve çalıştırılabilir izinlere sahip olduğunu (chmod +x .husky/pre-commit) doğrulayın.
  • Git'in core.hooksPath'ini inceleyin: Hook'lar hala çalışmıyorsa, Git'in Husky'nin dizinini kullanacak şekilde yapılandırılıp yapılandırılmadığını kontrol edin: git config core.hooksPath .husky.

2. İzin Hataları

İzin sorunları genellikle script'lerin çalıştırma izinlerinden yoksun olduğunda veya Husky düzgün şekilde başlatılmadığında ortaya çıkar:

  • Husky'yi yeniden başlatın: Hook'ların doğru şekilde bağlantılı olduğundan emin olmak için npx husky install komutunu çalıştırın.
  • Çalıştırma izinlerini ayarlayın: Tüm hook'ları yürütülebilir hale getirmek için chmod +x .husky/* komutunu kullanın.
  • Node.js ortamını kontrol edin: Script'in Node.js sürümünün projenizin gereksinimleriyle eşleştiğinden emin olun.

3. Yavaş veya Askıda Kalan Hook'lar

Performans darboğazları iş akışlarını bozabilir. Hook'ları şu şekilde optimize edin:

  • Bağımlılıkları en aza indirin: Pre-commit script'lerinde ağır kütüphanelerden kaçının.
  • Önbelleğe almayı kullanın: lint-staged gibi araçlar, tekrarlanan çalıştırmaları hızlandırmak için sonuçları önbelleğe alabilir.
  • Görevleri paralelleştirin: Mümkünse, hook'ları daha küçük, eşzamanlı işlemlere bölün.

4. Çapraz Platform Uyumluluğu

Hook'lar işletim sistemlerinde farklı davranabilir. Tutarlılığı sağlamak için:

  • Shebang satırlarını kullanın: Yorumlayıcıyı açıkça belirtin (örneğin, #!/usr/bin/env node).
  • Tüm hedef işletim sistemlerinde test edin: Hook'ların Windows, macOS ve Linux ortamlarında çalıştığını doğrulayın.
  • Satır sonlarını normalleştirin: Git'i satır sonlarını tutarlı bir şekilde işleyecek şekilde yapılandırın (git config --global core.autocrlf true).

Bu yaygın sorunları proaktif olarak ele alarak, Husky ile sorunsuz bir Git iş akışını sürdürebilirsiniz. Devam eden sorunlar için, gelişmiş sorun giderme için Husky'nin resmi belgelerine veya topluluk forumlarına danışın.

Modern yazılım geliştirmede tutarlılık esastır. İster küçük bir proje üzerinde çalışıyor olun, ister büyük ölçekli bir kurumsal uygulamada, kodun depoya ulaşmadan önce standartlara uygun olduğundan emin olmak kritik önem taşır. İşte burada Husky, commit öncesi hook yöneticisi olarak parlar, ancak değeri yerel kontrollerin çok ötesine uzanır—her dağıtım aşamasında tutarlılığı sağlamak için CI/CD hattınıza sorunsuz bir şekilde entegre edilebilir.

Neden CI/CD'de Husky?

Husky öncelikle commitlerden önce komut dosyalarını çalıştırmasıyla bilinir, ancak hook'ları CI/CD ortamlarında da tetiklenebilir. Husky kontrollerini hattınıza yerleştirerek, yerel olarak uygulanan kuralların otomatik iş akışlarında da uygulandığından emin olursunuz. Bu, geliştirici ortamları ile üretime hazır kod arasındaki tutarsızlıkları ortadan kaldırır ve hataların gözden kaçma riskini azaltır.

Örneğin, Husky kurulumunuzda linting, test veya biçimlendirme kontrolleri varsa, bunlar CI/CD hattınızda da yansıtılabilir. GitHub Actions, GitLab CI veya Jenkins gibi araçlar, her çekme isteği veya birleştirme isteğinin dağıtımdan önce aynı standartları karşıladığından emin olarak Husky hook'larını derleme sürecinin bir parçası olarak çalıştırabilir.

Pratik Uygulama

Husky'yi CI/CD hattınıza entegre etmek için şu adımları izleyin:

  • Hook'larınızı tanımlayın: ESLint, Prettier veya birim testleri gibi kontrolleri çalıştıran commit öncesi, push öncesi veya özel hook'ları ayarlamak için Husky'yi kullanın.
  • CI'da hook'ları tetikleyin: CI yapılandırmanızda (örneğin, GitHub Actions), husky install'ı çalıştırmak ve ardından hook'ları yürütmek için bir adım ekleyin. Örneğin:
steps:
  - name: Husky'yi Yükle
    run: npm install
  - name: Husky hook'larını Çalıştır
    run: npx husky install && npx husky run .husky/pre-commit
  • Hızlı başarısız olun: Herhangi bir Husky hook'u başarısız olursa, uyumsuz kodun ilerlemesini önleyerek hattınızı hemen başarısız olacak şekilde yapılandırın.

En İyi Uygulamalar

Husky'nin CI/CD'deki etkinliğini en üst düzeye çıkarmak için:

  • Hook'ları hafif tutun: Commit öncesi hook'larında uzun süren görevlerden kaçının; ağır kontrolleri CI için ayırın.
  • Beklentileri belgeleyin: Kafa karışıklığını önlemek için yerel olarak hangi kontrollerin çalıştığını ve CI'da hangilerinin çalıştığını açıkça belirtin.
  • Önbelleğe almadan yararlanın: Hook'larınız bağımlılıklar (örneğin, Node.js modülleri) içeriyorsa, yürütmeyi hızlandırmak için bunları CI'da önbelleğe alın.

Husky'yi CI/CD hattınıza yerleştirerek, ilk committen üretime kadar tutarlılığı sağlayan sağlam, uçtan uca bir uygulama mekanizması oluşturursunuz. Bu sadece kod kalitesini artırmakla kalmaz, aynı zamanda ekibiniz genelinde hesap verebilirlik ve güvenilirlik kültürünü de teşvik eder.