- mise, yeni monorepo görevleri özelliğini duyurdu
- Birden fazla projede ayrı ayrı ortamları, araçları ve görevleri kolayca yönetmek için birleşik bir görev ad alanı sunuyor
- Güçlü wildcard desenleri, ortam/araç kalıtımı ve tutarlı çalıştırma bağlamı gibi çeşitli özellikler içeriyor
- Farklı diller veya karmaşık ortamlara sahip monorepo'lar için sadelik ve esneklik sağlıyor
- Mevcut Bazel, Turborepo vb. ile karşılaştırıldığında dilden bağımsızlık, kolay yapılandırma ve birleşik yönetim güçlü yönleri arasında
Giriş: Monorepo görevleri özelliği duyuruldu
- mise, Monorepo Tasks adında yeni bir özellik sundu
- Birden fazla projenin bulunduğu depolarda her proje için araçları, ortam değişkenlerini ve görevleri bağımsız tutup verimli biçimde yönetmeyi sağlayan birinci sınıf monorepo desteği sunuyor
Temel özellikler
- Birleşik görev ad alanı: Monorepo içindeki tüm görevleri otomatik olarak bulur ve konuma göre önek ekleyerek açık biçimde ayırır
Örnek:
mise //projects/frontend:build
mise //services/api:deploy
- Akıllı araç ve ortam kalıtımı: Ortak araçlar kökte tanımlanır, gerektiğinde alt projelerde yeniden tanımlanabilir
- Örnek: kök
mise.toml içindeki node=20, python=3.12 ayarları tüm alt projelere otomatik olarak kalıtılır
- Belirli bir proje (
mise.toml) içinde node=14 ile override yapılabilir; üstteki python ayarı ise kalıtılmaya devam eder
- Güçlü wildcard desenleri:
- Tüm projelerde test çalıştırma:
mise //...:test
services/ altındaki tüm build'leri çalıştırma: mise //services/...:build
frontend içindeki tüm görevleri çalıştırma: mise '//projects/frontend:*'
- Görev adına göre gruplu çalıştırma yapılabilir
- Her zaman tutarlı çalıştırma: Görev nereden çalıştırılırsa çalıştırılsın, ilgili görevin
config_root içinde tanımlanan ortam ve araçlarla aynı şekilde çalışır
- Otomatik güven yayılımı: Yalnızca monorepo kökü Trust olarak işaretlenirse alt yapılandırmalar otomatik olarak güvenilir kabul edilir
Hızlı başlangıç kılavuzu
- Kök
mise.toml içinde experimental_monorepo_root=true ayarını yapın
- Deneysel bayrağı etkinleştirin:
MISE_EXPERIMENTAL=1
- Her projenin
mise.toml dosyasına tasks ekleyin
- Örnek:
[tasks.build]
run = "npm run build"
- Kökten veya herhangi bir yoldan istediğiniz görevi çalıştırın
mise //projects/frontend:build
mise //...:test
Örnek monorepo yapısı
- myproject/
├── mise.toml (experimental_monorepo_root = true)
├── services/
│ ├── api/mise.toml
│ ├── worker/mise.toml
│ └── scheduler/mise.toml
└── apps/
├── web/mise.toml
└── mobile/mise.toml
- Tüm servislerin build'ini çalıştırma:
mise //services/...:build
- Tüm uygulamalarda test çalıştırma:
mise //apps/...:test
- Tüm görevler:
mise '//...:*'
Çıkış noktası ve etkileri
- Monorepo yönetimindeki karmaşıklık ve tekrar eden script'lerle ilgili sorunlardan yola çıkıyor
- once tanımla, her yerden çalıştır yaklaşımıyla tekrarları en aza indiriyor
- Her proje için doğru araç/ortamı otomatik uyguluyor
- Güçlü wildcard'larla CI/CD pipeline'larını basitleştiriyor
- Görev ad alanı ile keşfi ve anlaşılabilirliği artırıyor
Mevcut başlıca araçlarla karşılaştırma
-
Basit görev çalıştırıcıları (Taskfile, Just vb.)
- Tek proje otomasyonu için optimize edilmiştir; monorepo'da birleşik ad alanı, kalıtım ve wildcard desteği yoktur
- mise, otomatik görev keşfi ve güçlü desen desteği sunar
-
JavaScript merkezli araçlar (Nx, Turborepo, Lerna)
- JS/TS monorepo'larında güçlüdür (dependency graph, codegen, cache vb.)
- mise, dilden bağımsızdır, farklı dil/yığınlara uyum sağlar ve birleşik araç/ortam değişkeni yönetimi sunar
-
Büyük ölçekli build sistemleri (Bazel, Buck2)
- Dağıtık cache, remote execution vb. sunar ancak karmaşıklık ve öğrenme eğrisi yüksektir, yapısal kısıtlar fazladır
- mise, non-hermetic bir yaklaşım benimser; esnek yapılandırma ve kolay benimseme sağlar
-
Diğerleri (Rush, Moon vb.)
- Rush: JS odaklı build orchestration
- Moon: Rust tabanlı, çoklu dil desteğini hedefler
mise Monorepo Tasks'ı özel kılan nedir?
| Özellik |
Basit Runner'lar |
JS uzmanı |
Build sistemleri |
mise |
| Çoklu dil desteği |
✅ |
❌ |
✅ |
✅ |
| Öğrenmesi kolay |
✅ |
⚠️ |
❌ |
✅ |
| Birleşik görev keşfi |
❌ |
✅ |
✅ |
✅ |
| Wildcard desenleri |
❌ |
⚠️ |
✅ |
✅ |
| Araç sürüm yönetimi |
❌ |
❌ |
⚠️ |
✅ |
| Ortam kalıtımı |
❌ |
⚠️ |
❌ |
✅ |
| Minimum yapılandırma |
✅ |
⚠️ |
❌ |
✅ |
| Görev önbellekleme |
❌ |
✅ |
✅ |
❌ |
- Mise ne zaman seçilmeli?
- Karma dilli monorepo'lar
- Birleşik araç ve görev yönetimi
- Sadelik tercih edildiğinde
- mise deneyimi olan kullanıcılar için uygun
- Ne zaman başka seçenekler düşünülmeli?
- Yalnızca JS/TS odaklıysa → Nx, Turborepo
- Çok büyük kurumsal ölçek (Google/Meta vb.) → Bazel, Buck2
- Gelişmiş görev önbellekleme gerekiyorsa → Nx, Turborepo, Bazel
Sonuç
- mise'nin monorepo görevleri özelliği, tek bir dille sınırlı kalmadan farklı dil ortamlarına sahip karmaşık monorepo'ları kolay ve tutarlı biçimde yönetmek için tasarlandı
- Minimum yapılandırma ve güçlü görev desenleriyle geliştirici üretkenliğini ve deneyimini birlikte artırıyor
- Karmaşık kurumsal çözümlere kıyasla çok daha sade ve esnek
2 yorum
Mise - çok dilli (Polyglot) sürüm yöneticisi
Mise: geliştirme araçları, ortam değişkenleri, görev çalıştırıcısı
Hacker News görüşleri
Daha önce ağırlıklı olarak Python kullanırken Mise’in cazibesini pek hissedememiştim,
uv’nin yeterli olduğunu düşünüyordumAma Node’da olduğu gibi her dizin için sürümü eşleştirmek ve dil ya da proje türünden bağımsız olarak
mise buildveyamise testgibi ortak giriş noktalarına ihtiyaç duyunca Mise’in gerçek değerini anladımJust’ı da görev çalıştırıcısı olarak gerçekten seviyorum ve onun sayesinde Make’ten uzaklaşabildim
Make güçlü ama geliştirici deneyimi açısından eksikleri vardı
Just, özellik açısından Mise’in task işlevinden daha güçlü olabilir ama Mise, gayet iyi bir task özelliğini mükemmel araç yönetimiyle birlikte sunduğu için benim için en iyi kombinasyon
Basit Makefile’ları seven biri olarak merak ettiğim bir şey var: Make’ten Just’a, oradan da Mise’e geçerken ne gibi avantajlar gördün?
just’ı gerçekten çok seviyordum amajusttask’lerinde doğru ortamı kurmak zahmetliydi ve sanal ortamı yüklemek de uğraştırıyorduBu yüzden ben de benzer nedenlerle
mise’e geçtimmisekonusunda büyük beklentilerim varYeni bir projeye her başladığımda vazgeçilmez araçlardan biri haline hızla geldi
Tek bir yapılandırma dosyasıyla
node,python,rust,gogibi birden çok aracı yönetebilmek ve kolay kullanılabilen bir Makefile alternatifi sunması çok pratikGenelde
postinstallhook’u ayarlıyorum; böylece biri projemi aldığında sadecemise installçalıştırarak doğru araç sürümlerini ve bağımlılık paketlerini otomatik olarak kurabiliyor, bu da işi gerçekten çok kolaylaştırıyorNix’in giriş engelinin yüksek olduğunu düşünürken,
miseçok daha pratik geliyorNix yaklaşımı göz korkutuyorsa, devenv.sh gibi araçlar erişilebilirliği ciddi biçimde artırıyor
Örneğin
languages.rust.enable = trueile Rust geliştirme ortamını hemen kurabiliyorsunBuna ek olarak script’ler, task’ler ve paketler de eklenebiliyor
Örnek bir yapılandırma paylaşabilir misin diye merak ediyorum
Anlattıkların ilgi çekici
Monorepo projelerinde
justvedocker(-compose)kullanıyordum;moonveprotodenemelerim ise kısa sürdü ve biraz hayal kırıklığı yarattıjust’ın sadeliği güzel ama farklı platformlarda yeni ekip üyelerini sisteme dahil ederken hâlâ zahmetliBen de yeni bir projeyi
miseile kurdumYeni gelenlerin manuel adımlar olmadan çok daha rahat başlamasını sağladığı için gerçekten harika
miseiçindepostinstallhook’u kullanman ilgimi çektiGenelde içine neler koyuyorsun?
Task cache desteğinin olmaması bence oldukça büyük bir eksik
Görev grafiğinde bağımlılıklar oluştuğunda, tamamlanmış task’lerin tekrar çalıştırılmak yerine cache’ten karşılanması tekrar eden çalıştırmalarda verimlilik için önemli; özellikle orta ölçekli monorepo’larda
Bu özelliğin planlanıp planlanmadığını araştırdım ama Mise deposunda issue’lar kapalıydı ve README’de de buna dair bir şey göremedim, bu da güven vermedi
Eğer tek dilli bir
npmmonorepo kullanıyorsanız Wireit’i öneririmWireit,
npmscript’lerine bağımlılıklar ile yerel/GitHub Actions cache işlevi ekliyor ve uzun süre çalışan servis tipi task’ler sunuyorWireit GitHub
Mise, Make benzeri task’ler için yerel cache’i destekliyorsourcesveoutputsbelirtirsen mümkün; mise task yapılandırma kılavuzunda görebilirsinSadece
sourcesbelirtmek bile kaynak değişikliklerinin otomatik izlenmesini sağlıyorBu özelliği Docker build’lerini hızlandırmak için uzun zaman önce istemiştim ve gerçekten çok faydalı kullanıyorum
Aslında
mise’in proje kaynak kodu ya da kütüphane bağımlılıklarıyla daha az ilgilenmesi, sadeliğinin çekici tarafıGenelde yalnızca o sınıra kadar işlev sunuyor
Task cache’leme,
mise’in hedefleriyle çok da uyumlu değilanti-goals resmi dokümanına bakabilirsin
turbopack,moonrepogibi araçlar zaten bu probleme odaklanıyormisebüyük olasılıkla sadece script çalıştırmaya odaklanan hafif bir task runner olarak kalacakMise deposundaki issue’ların neden kapalı olduğunu ben de bilmiyorum
Eskiden “maintainer issues yerine discussion’ı tercih ediyor” diyen bir issue vardı ama şimdi kaldırılmış
Bununla ilgili şu tartışmayı başlattım
Benim gibi birkaç yıldır kullanan biri olarak bu projeye güvenim yüksek ve çevreme de öneriyorum
Discussion’lara ve gerçek kullanım deneyimlerine bakmanı tavsiye ederim
Bu,
mise’den bir build sistemi (bazeltürü) özelliği istemeye benziyorZaten belki de bir ölçüde öyle bir rol oynuyor denebilir
Cache özelliği faydalı olsa da, ek özelliklerle karmaşıklığın artmamasına dikkat etmek gerekir
Mevcut build sistemleriyle entegrasyon yolları da düşünülebilir
miseoldukça iyi görünüyorAncak şu an bir
asdfkullanıcısı olarak,mise’in çeşitli şeyleri (PATHdüzenleme gibi) biraz fazla yönetmeye çalıştığı izlenimi beni hafif tereddütte bırakıyorFarklı araçların
PATH’i farklı şekillerde kurcalaması gerçekten çok can sıkıcı olduğu için.zprofileiçindePATH’i sabitledim ve çeşitli başlatma script’lerini de tamamen çıkardımmise, programlama dillerini ve o diller üzerinden kurulan CLI uygulamalarını (cargo,go,uvvb.) birlikte yönetebiliyorsa güzel olur ama geçiş sırasında o kısım biraz uğraştırıcı olabilir gibi geliyorBirden fazla aracın
PATHönceliğiyle oynamasının rahatsız edici olduğunu söylemiştin amamisebunu yapmıyorİstersen shim de kullanabilirsin
Hem dile özgü araçları hem de dilin kendisini yönetebiliyor
Daha önce neden
asdf’denmise’e geçtiğimi tam hatırlamıyorum ama birkaç yıldır kullanıyorum ve hiçbir sorun yaşamadımBence
misegerçekten müthişOtomasyona, aynı ortamı yeniden kurmaya ve yeni projeleri hızlıca bootstrap etmeye önem veren insanlar için biçilmiş kaftan
Özellikle Ruby/Python/Node ortamlarında ortaya çıkan farklı kurulum yöntemleri ve tekrarlanabilir ortam sorunlarını Docker benzeri şeylere ihtiyaç duymadan basitçe çözüyor
Küçük ekiplerde veya kişisel projelerde, CI ortamı ya da build sistemi (
Bazel,Gradlevb.) olmadan da tekrarlanabilir çalışma ortamlarını kolayca kurabiliyorsunchezmoiile birlikte yerel sistem araçlarını yönetmek için de gayet iyi kullanıyorumYakın zamanda
just’tanmise’e geçtimjustda harika ama sadece komut çalıştırıcı işlevi sunuyor; ben isemise’in ek özelliklerine ihtiyaç duyuyordumGeçiş yaptığıma memnunum
Yine de kullanım senaryoları, geçmişi, başka araçlarla (
nix,dockervb.) karşılaştırması ve yapısal açıklamaları, yeni başlayanların anlayacağı şekilde daha iyi anlatılsa güzel olurduGerçek, küçük farkları örneklerle göstererek
mise’in neden gerekli olduğunu ve zaten var olan diğer araçlardan hangi yönleriyle ayrıştığını daha net belgelemelerini isterimBu haber beni gerçekten heyecanlandırdı
just/taskfilegibi basit task runner’ların avantajlarıylabazel/buck2gibi güçlü araçların bazı yönlerini dengeli biçimde birleştiriyor gibi hissettiriyorBaşkalarının bunu nasıl kullanacağını merak ediyorum ve yeni denemeleri görmek için sabırsızlanıyorum
misekullanıyorum ve genel olarak memnunumOrtam yönetimi iş akışım çok sadeleşti
Ama task runner özelliğine özel olarak ihtiyaç duymuyorum
Make veya
justbu rolü yeterince iyi yerine getiriyorMonorepo’da bizzat denemedim ama her iki araç da task/recipe dosyalarının import ve genişletilmesini desteklediği için ihtiyaca göre bir kurulum yapılabileceğini düşünüyorum
Kullanım deneyimi özel amaçlı araçlar kadar pürüzsüz olmayabilir ama ben her aracın tek bir işe odaklanmasını tercih ediyorum
misezaten ortam yöneticisi rolünde çok sayıda özellik barındırıyor; o tarafa odaklanması daha iyi olurBu arada karşımdaki kişinin
miseyazarı olduğunu sanıyorum, teşekkürlerEğer depodaki task’leri tek bir giriş noktasından yönetmek istiyorsanız, benim yaptığım dela değerlendirilebilir
pyproject.toml,package.json,makefilegibi çeşitli task dosyası tanımlarını tarıyor ve task adlarıyla bunları doğrudan CLI üzerinden çalıştırmanıza izin veriyorBunu birçok repoda hiçbir iyileştirme yapmadan hemen kullanabildim, bu yüzden çok pratikti; repo yapısını değiştirmeyi gerektirmemesi de avantaj
Henüz
misetask’lerini desteklemiyor ama talep olursa hemen eklemeye hazırımSon sayımlara göre
mise, yıldızlı 100 bin GitHub deposunun 94’ünde kullanılıyorAyrıntılı veriler için 2025 task runners census bağlantısına bakabilirsiniz
Bir Node proje deposuna girdiğimde ilk yaptığım şey her zaman script listesini görmek için
npm runçalıştırmak oluyorMakefile varsa içine bakıyorum ama target’lar veya bağımlılıkların hepsi değişkenlerle yazılmışsa hemen çıkıyorum
Aslında tam da
mise’de böyle bir özellik olsa iyi olur diye düşünüyordum; yeni gelmiş olması sevindiricimise’i kullanırken en çok sevdiğim şey,npm,go,cargogibi araçlarla arka planda global araçlar kurabilmesiMesela
mise use -g npm:prettiergibi basit bir komutla kolayca kurabiliyorsunEskiden
nvmkullanırken hanginodesürümüne hangi global paketi kurduğumu sürekli hatırlamam gerekiyordu;misesayesinde bu çok daha kolaylaştıAma yakın zamanda en yeni
nodesürümünü kurmaya çalıştığımda, bir küçük hata yüzünden en yeninin bir altı kurulmuştuEğer saf
Nix-shellkullanabiliyorsanız,misebiraz daha az çekici gelebilirYine de Nix’e göre öğrenme eğrisi daha düşük olduğu için daha geniş yayılabilir gibi duruyor
mise, kişinin kendisi veya kendi bilgisayarı için değil, farklı insanların bir projeyi kolayca bootstrap edebilmesine odaklanması açısından gerçekten öne çıkıyortomltabanlı yapılandırması da insanların anlaması açısından oldukça basitEskiden README’leri didik didik edip ortamı elle kurmak, dilden dile değişen kurulum yöntemleriyle uğraşmak gerekirdi;
miseile bunlar sorun olmuyorÖzellikle Node/Ruby/Python tarafındaki ortamları yönetirken çok avantajlı
nix-darwin’i bir yıl kullandıktan sonra sonundamise’e geçtimmise, ihtiyacım olan şeylerin %90’ını zahmetin yalnızca %1’iyle karşılıyorNix’in kavramlarını da beğeniyorum ve gelecekte yazılım derleme yaklaşımının kesinlikle bu yöne gideceğini düşünüyorum
Ama şu anda bunun taşıyıcısının Nix olmayabileceğini düşünüyorum