9 puan yazan GN⁺ 2025-09-18 | 2 yorum | WhatsApp'ta paylaş
  • Homebrew, macOS'ta CLI araçlarını kolayca kurup yönetmeyi sağlayan bir paket yöneticisidir; geliştiricilerin sık kullandığı araçlarla sistem ortamını verimli biçimde yapılandırmasına yardımcı olur
  • Bu rehber, Homebrew kullanarak kişisel CLI script'lerini dağıtma sürecini açıklar ve GitHub entegrasyonu ile otomasyon iş akışları sayesinde bakımı nasıl sadeleştirebileceğini gösterir
  • Dağıtım süreci CLI oluşturma → GitHub release → Tap oluşturma → Formula yazma ve güncelleme şeklinde ilerler; sonunda yalnızca brew tap ve brew install komutlarıyla kurulum yapılabilir
  • Homebrew'un terminolojisini ve en iyi uygulamalarını anlamak, yeniden üretilebilirliği ve tedarik zinciri güvenliğini güçlendiren sağlam bir dağıtım süreci sağlar
  • GitHub Actions iş akışlarıyla bu süreç otomatikleştirilebilir; bir kez kurulduğunda sonraki CLI dağıtımları da çok daha kolay hale gelir

Arka plan ve motivasyon

  • Homebrew, CLI araçları kurulurken tercih edilen paket yöneticilerinden biridir ve birçok geliştirici tarafından kullanılır
  • Ancak kendi geliştirdiğiniz CLI'yi çoğu zaman npm veya RubyGem üzerinden dağıtırsınız; bu yüzden Homebrew ile dağıtım süreci ilk başta yabancı gelebilir
  • Homebrew'un resmî core deposu, ekip politikasına göre kişisel veya özel yapım araçların eklenmesine sıcak bakmaz; bu nedenle genel geliştiriciler ayrı bir tap ve formula ile dağıtım yapar
  • Bu rehber, basit bir Ruby tabanlı CLI dağıtım deneyimine dayanarak anlatılmıştır

Terimler

  • Homebrew, bira üretimi temasını yansıtan kendine özgü terimler kullanır; bunları anlamak sistem yapısını kavramayı kolaylaştırır
    • Formula, paket tanımı dosyasıdır; kaynak kodu veya binary'leri kurmak için gereken talimatları içerir
    • Tap, Formula'ların bulunduğu bir Git deposudur; kullanıcı veya organizasyon bazında özel paketler burada yönetilir
    • Cask, GUI uygulamaları veya büyük binary'leri kurmak için kullanılan manifest'tir; Formula'ya benzer ama önceden derlenmiş dosyaları işler
    • Bottle, kaynaktan derlemek yerine önceden derlenmiş binary paketin kopyalanması yaklaşımıdır; böylece kurulum hızlanır
    • Cellar, kurulu Formula'ların bulunduğu dizindir; örneğin /opt/homebrew/Cellar yolunu kullanır
    • Keg, belirli bir Formula'nın kurulum örneği dizinidir ve Cellar içinde sürüm bazında yer alır

Genel bakış

  • Homebrew core deposu niş veya kişisel gönderimleri kabul etmediği için, kullanıcıların CLI'lerini dağıtmak üzere ayrı bir tap deposu oluşturması gerekir
    • 1. CLI'yi oluşturup GitHub'a yükleyin ve etiketli release yayınlayın
    • 2. brew tap-new ile Tap oluşturup GitHub'a push edin
    • 3. brew create ile Formula yazın (tarball URL'si ve SHA256 dahil)
    • 4. Her yeni sürümde Formula'yı güncelleyerek kullanıcıların brew install komutuyla kolayca kurabilmesini sağlayın
  • Dağıtım tamamlandıktan sonra kullanıcılar CLI'yi iki komutla kurabilir: brew tap your_github_handle/tap ve brew install your_cool_cli
    • Bu rehber CLI geliştirme kısmını atlar; tap oluşturma, Formula üretme ve güncelleme sürecine odaklanır
    • Örnek olarak, iMessage veritabanından etkileşimli bir web arşivi üreten imsg CLI'si kullanılır
    Reklam

Tap oluşturma

  • Homebrew'un tap oluşturma rehberini izleyin ve kendi GitHub kullanıcı adınız veya organizasyon adınızla uyarlayın
    • İleride tüm CLI araçlarını tek bir tap altında toplamak için homebrew-tap adı önerilir; homebrew öneki CLI tarafından özel işlenir, tap son eki ise yerleşik bir gelenektir
  • Tap oluşturma komutunu çalıştırın: brew tap-new searlsco/homebrew-tap
    • Bu komut /opt/homebrew/Library/Taps/searlsco/homebrew-tap altında iskelet yapıyı oluşturur
    • GitHub'da karşılık gelen depoyu oluşturun ve üretilen içeriği gönderin: cd /opt/homebrew/Library/Taps/searlsco/homebrew-tap, git remote add origin git@github.com:searlsco/homebrew-tap.git, git push -u origin main
  • Tap'in sahibi olduktan sonra diğer kullanıcılar brew tap searlsco/tap komutuyla bu depoyu klonlayıp /opt/homebrew/Library/Taps altına yerleştirebilir
    • Başlangıçta içinde faydalı bir şey olmasa da temel davranış doğrulanabilir

Formula oluşturma

  • Homebrew, GitHub depolarını doğrudan referans alabilse de sürümlenmiş tarball ve checksum kullanılmasını önerir; bu da yeniden üretilebilirliği ve açık kaynak tedarik zinciri güvenliğini artırır
    Reklam
  • Formula oluşturma komutu: brew create https://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gz --tap searlsco/homebrew-tap --set-name imsg --ruby
    • --tap bayrağı özel tap'i belirtir ve Formula'yı /opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formula içine yerleştirir
    • --set-name imsg, Formula adını açıkça belirler; çakışmaları önlemek için benzersiz seçilmelidir (ör. mevcut TLDR veya standard CLI ile çakışmamaya dikkat edin)
    • --ruby, Ruby CLI'leri için bir şablon ön ayarıdır; özelleştirmeyi kolaylaştıran seçeneklerden biridir
  • Oluşturulan Formula başlangıçta çalışmayabilir; bunu düzeltmek için LLM'den yararlanabilirsiniz: brew install --verbose imsg çalıştırın, hatayı ChatGPT'ye verin ve Formula'yı yinelemeli olarak güncelleyin
    • Son Formula/imsg.rb dosyası, Ruby CLI dağıtımı için başlangıç noktası olarak kopyalanabilir
    • Dile özgü paket yöneticileri yerine Homebrew üzerinden dağıtım yapmak, uygulama dilini değiştirseniz bile kullanıcı yükseltmelerini daha sorunsuz hale getirir

Formula için önemli noktalar

  • Tüm Formula'lar Ruby ile yazılır; çünkü JavaScript ve yapay zeka öncesinde popüler geliştirici araçlarının çoğu Ruby tabanlıydı
    • head metodu ile Git deposu belirtilebilir, ancak pratik etkisi belirsizdir
    • livecheck eklemek değerlidir; Formula sürüm güncellemelerini kolaylaştırır
    • Binary çalıştırma testi, yardım çıktısını doğrulayan basit bir testle uygulanabilir; oluşturulan yorumların gözünüzü korkutmasına izin vermeyin
    • Stil hatalarını kontrol etmek için brew style searlsco/tap komutunu kullanın
    • --ruby şablonunun varsayılan uses_from_macos "ruby" ayarı 2.6.10 sürümünü kullanır (COVID öncesi çıkmış, 3 yıl önce EOL olmuş bir sürüm); bu nedenle depends_on "ruby@3" ile güncel ruby Formula bağımlılığı önerilir
  • Formula istediğiniz hale geldiğinde git push ile canlıya alınabilir; kullanıcılar da brew tap searlsco/tap ve brew install imsg ile kurabilir
Reklam

Her CLI release'i için Formula güncelleme

  • Formula'nın üst kısmındaki url ve sha256 değerlerini her release'te elle güncellemek yorucudur; etiket push etmek veya GitHub release oluşturmak bile ayrı bir yük olabilir
    • Homebrew'un bump-formula-pr komutu veya GitHub Actions ile PR üretmek mümkün olsa da fork ve PR süreci gereksiz derecede karmaşık olabilir
    • Tap sahibiyseniz, doğrudan main branch'e commit eden daha basit bir yaklaşım tercih edilebilir
  • Bunu önlemek için Formula deposuna bir GitHub workflow'u eklemeniz önerilir; böylece release olduğunda tap otomatik güncellenir
    • Workflow örneğini kopyalayıp kullanabilirsiniz
    • Gerekli ayar: GitHub kişisel erişim token'ı (PAT) oluştururken homebrew-tap deposu için ContentWrite yetkisi verin ve bunu Formula deposunun Secrets bölümünde HOMEBREW_TAP_TOKEN adıyla saklayın
    • Ortam değişkenleriyle tap ve Formula'yı belirtin (ör. 13-15. satırlar)
    • GitHub bot hesabı güncellemesi önerilir: GH_EMAIL: 41898282+github-actions[bot]@users.noreply.github.com, GH_NAME: github-actions[bot]
  • Release oluşturup git push --tags çalıştırdıktan birkaç saniye sonra otomatik güncelleme gerçekleşir; kullanıcılar brew update ve brew upgrade imsg ile yükseltebilir

En iyi kısmı

  • Bu süreç karmaşık görünse de, tap kurulumu ve tek bir Formula örneği tamamlandıktan sonra ek CLI dağıtımları neredeyse önemsiz bir iş haline gelir
    • Birkaç dakika içinde yeni bir Formula yayımlayabilmek oldukça pratiktir
  • Homebrew'un resmî süreci biraz karmaşık olsa da otomasyonla ciddi biçimde kolaylaşır
    • Her araçta release ile dağıtım arasındaki sürtünmeyi azaltır ve farklı dillerde yazılmış CLI'lere kadar genişleyebilir
  • Gerçekte bir Formula daha yayımlanır mı bilinmez, ama bu seçeneğin açık olması bile tatmin edicidir

2 yorum

 
lamanus 2025-09-18

Homebrew'un bump-formula-pr komutu ya da GitHub Actions ile PR oluşturmak mümkün, ancak fork ve PR süreci gereksiz yere karmaşık.

Doğrudan branch'e push edip merge etmeyi sağlayan --no-fork seçeneği var ve otomatik güncelleme özelliği sunuyor.

 
GN⁺ 2025-09-18
Hacker News yorumu
  • Homebrew'un adlandırma kuralları bazen kafa karıştırıcı gelebiliyor ama genel olarak gerçekten çok faydalı bir araç olduğunu düşünmeye devam ediyorum
    Ayrıca kendi tap'inizi oluşturup araç dağıtma sürecinin bu kadar basit olacağını bilmiyordum
    Dile özgü paket yöneticileriyle (ör. uv) karşılaştırıldığında hangi yönlerinin daha iyi olduğunu merak ediyorum
    Özellikle belirli bir ekosistemin içinde olmayan kişiler için daha kolay olup olmadığını, yani genel kullanım açısından bir üstünlüğü bulunup bulunmadığını öğrenmek isterim

    • Teşekkürler; paket kayıt defteri kullanan diğer araçlarda genellikle hesap oluşturma, iki aşamalı doğrulama, imzalama süreçleri vb. gerekiyor
      Homebrew'de ise GitHub hizmet şartları (ToS) güvenin temeli olarak iş gördüğü için genel olarak çok daha sade bir süreç var
      Homebrew ekibi de bu yöntem sayesinde pek çok karmaşıklığı azaltabiliyor

    • Python paketleri açısından konuşursak, uv gibi her şeyi tek seferde paketlemeye çalışan girişimler pratikte zor
      Bu yüzden genellikle venv ortamına sabitlenmiş bağımlılıkları kurma yaklaşımı kullanılıyor
      Somut bir örnek olarak bu formula incelenebilir
      uv konusunda ise, resmi araçlarla (brew update-python-resources, homebrew-pypi-poet) özel paket desteği sağlamaya çalıştım ama düzgün çalışmadı
      Bu yüzden kaynak üretimine yardımcı olması için doğrudan uvbrew aracını yaptım
      Homebrew'de Python formula yazımı için resmi dokümantasyon da mevcut

  • Go geliştiricileri için Goreleaser aracını öneririm
    Kişisel tap içinde binary dağıtımını çok kolay hale getiriyor (resmi core'da buna izin verilmiyor)

    • Bunu yakın zamanda öğrendim: Goreleaser artık yalnızca Go değil, Rust, TypeScript, Python, Zig gibi birçok dili de destekliyor
      Her dilde proje yönetiminde oldukça kullanışlı
  • Kişisel olarak, güncellemelerin doğrudan tap tarafında yönetilmesinin daha ideal olduğunu düşünüyorum
    Genel olarak upstream'in güncellemeyi yönetmesine benzer bir yaklaşım
    Bu workflow incelenirse, sahip olmadığınız formula/cask'ları bile kolayca güncelleyebilirsiniz
    brew bump komutuyla hepsi taranabiliyor, PR oluşturulabiliyor ve brew test-bot ile testler de otomatikleştirilebiliyor
    Gerçek bir PR örneği burada görülebilir

    • Bunun iyi bir fikir olduğunu düşünüyorum
      Normalde GitHub Actions kullanım süresine kıyamadığım için pek cesaret edemiyordum ama açık kaynakta ücretsiz olduğu için böyle bir kullanım mantıklı görünüyor
  • Kendi Homebrew tap sürüm otomatik bump workflow'um için homebrew-bump-revision aracını bizzat yazdım
    Bunu çeşitli kişisel projelerde verimli şekilde kullanıyorum

    • Güzel görünüyor
      Ben üşendiğim için denemedim ama iyi bir araç
  • Ruby Rogues podcast'inde, Homebrew ile CLI dağıtırken çeşitli ipuçlarının ele alındığı bir bölüm vardı
    İlgili bölüm bağlantısından daha fazla şey dinlenebilir

  • Python araç paketleme konusunda ilginç bir nokta fark ettim
    Bazı Python paketlerinde build sürecinde bağımlılık döngüsü oluşuyor ve bu yüzden Homebrew ile uyumlu olmuyorlar
    pip binary sürümleri indirdiği için sorun yaşamıyor ama Homebrew tüm bağımlılıkları da kendisi build ettiği için bu süreç çok daha uzun sürüyor
    Bu nedenle orta ölçekli bir Python projesinin bile "bottle" build'i bir saatten uzun sürebiliyor

  • Sistem yönetimi için nix kullanmaya başladığımdan beri bir kez bile pişman olmadım
    Tek eksisi, çok oyunculu oyunlar yüzünden Windows'a bağımlı olmam gereken tek bir alanın hâlâ var olması