Homebrew ile kendi script'lerinizi dağıtmak
(justin.searls.co)- 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 tapvebrew installkomutları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/Cellaryolunu 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-newile Tap oluşturup GitHub'a push edin - 3.
brew createile Formula yazın (tarballURL'si ve SHA256 dahil) - 4. Her yeni sürümde Formula'yı güncelleyerek kullanıcıların
brew installkomutuyla kolayca kurabilmesini sağlayın
- Dağıtım tamamlandıktan sonra kullanıcılar CLI'yi iki komutla kurabilir:
brew tap your_github_handle/tapvebrew 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
imsgCLI'si kullanılır
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-tapadı önerilir;homebrewöneki CLI tarafından özel işlenir,tapson eki ise yerleşik bir gelenektir
- İleride tüm CLI araçlarını tek bir tap altında toplamak için
- Tap oluşturma komutunu çalıştırın:
brew tap-new searlsco/homebrew-tap- Bu komut
/opt/homebrew/Library/Taps/searlsco/homebrew-tapaltı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
- Bu komut
- Tap'in sahibi olduktan sonra diğer kullanıcılar
brew tap searlsco/tapkomutuyla bu depoyu klonlayıp/opt/homebrew/Library/Tapsaltı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
- GitHub, etiket push edildiğinde tahmin edilebilir bir URL'de tarball barındırır; örneğin
imsgdeposundagit tag v0.0.5,git push --tagssonrasıhttps://github.com/searlsco/imsg/archive/refs/tags/v0.0.5.tar.gzoluşur
- GitHub, etiket push edildiğinde tahmin edilebilir bir URL'de tarball barındırır; örneğin
- 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--tapbayrağı özel tap'i belirtir ve Formula'yı/opt/homebrew/Library/Taps/searlsco/homebrew-tap/Formulaiç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ı
headmetodu ile Git deposu belirtilebilir, ancak pratik etkisi belirsizdirlivecheckeklemek 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/tapkomutunu kullanın --rubyşablonunun varsayılanuses_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 nedenledepends_on "ruby@3"ile güncel ruby Formula bağımlılığı önerilir
- Formula istediğiniz hale geldiğinde
git pushile canlıya alınabilir; kullanıcılar dabrew tap searlsco/tapvebrew install imsgile kurabilir
Her CLI release'i için Formula güncelleme
- Formula'nın üst kısmındaki
urlvesha256değ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-prkomutu 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
- Homebrew'un
- 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-tapdeposu içinContent→Writeyetkisi verin ve bunu Formula deposunun Secrets bölümündeHOMEBREW_TAP_TOKENadı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ılarbrew updatevebrew upgrade imsgile 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
Doğrudan branch'e push edip merge etmeyi sağlayan
--no-forkseçeneği var ve otomatik güncelleme özelliği sunuyor.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)
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 bumpkomutuyla hepsi taranabiliyor, PR oluşturulabiliyor vebrew test-botile testler de otomatikleştirilebiliyorGerçek bir PR örneği burada görülebilir
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
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ı