Neden Paketler
Dili öğrenirken ya da bir snippet denerken tek bir .0 dosyası yeterli. Projeniz tek bir dosyayı aştığı an, bir paket istersiniz — bir manifest'i ve toolchain'in anladığı bilinen bir düzeni olan bir dizin.
Dağınık dosyalardan bir pakete geçmenin faydaları:
- Projenin adı, sürümü ve metadata'sı için tek bir kanonik yer.
- Tek bir ağaçta birden çok giriş noktası (executable, library, testler).
- Öngörülebilir düzen: araçlar kaynağınızı yapılandırma olmadan bulabilir.
- Dosya dosya değil, ağacın tamamına karşı
zero check/zero build.
Bir Paket İskeletlemek
Başlamanın en hızlı yolu zero new:
zero new cli hello
Bu, şöyle düzenlenmiş bir hello/ dizini yaratır:
hello/
├── zero.json
└── src/
└── main.0
cli template adı — executable bir komut satırı programı üretir. Diğer template'ler (library, system programı) aynı şekli farklı varsayılanlarla takip eder.
Yeni dizine cd yapın, çalıştırın, hazırsınız:
cd hello
zero run
Bir paket dizininin içinden dosya adı vermeden zero run çağırdığınızda, varsayılan target'ı zero.json'dan alır ve onu çalıştırır.
zero.json Manifest'i
İskeletlenen bir cli paketinin manifest'i şöyle görünür:
{
"package": { "name": "hello", "version": "0.1.0" },
"targets": { "cli": { "kind": "exe", "main": "src/main.0" } }
}
İki üst seviye anahtar: package ve targets. Birincisi paketi tanımlar; ikincisi compiler'a ne build edeceğini söyler.
package
"package": {
"name": "hello",
"version": "0.1.0"
}
name— paketi tanımlayan bir slug. Küçük harf ve tire kullanın.version— semver string. Pre-1.0 paketleri0.x.ykullanır.
Diğer metadata alanları (description, author, license, repository) desteklenebilir — manifest hâlâ değiştiği için yetkili şema için güncel Zero dokümanlarına bakın.
targets
"targets": {
"cli": { "kind": "exe", "main": "src/main.0" }
}
Anahtarlar (burada cli) sizin seçtiğiniz target adları. Değerler her target'ı tarif eder:
kind— target ne. Executable içinexe. Diğer kind'lar (library, test) aynı şekli takip eder.main— paket kökeen göre relative giriş kaynak dosyası.
Aynı pakette birden fazla target bildirebilirsiniz:
{
"package": { "name": "image-tools", "version": "0.1.0" },
"targets": {
"convert": { "kind": "exe", "main": "src/convert.0" },
"resize": { "kind": "exe", "main": "src/resize.0" },
"lib": { "kind": "lib", "main": "src/lib.0" }
}
}
Belirli bir target'ı adıyla CLI üzerinden build edin:
zero build convert
zero run resize
src/ Dizini
Tüm kaynak dosyaları src/ altında yaşar. Compiler bu dizini otomatik dolaşır — her dosyayı manifest'te listelemenize gerek yok. Her target'ın main alanı giriş dosyasını gösterir; compiler oradan import'ları takip ederek geri kalan her şeyi bulur.
Birkaç yardımcı modülü olan bir paket şöyle görünebilir:
image-tools/
├── zero.json
└── src/
├── convert.0
├── resize.0
├── lib.0
└── internal/
├── decoder.0
└── encoder.0
internal/ alt dizini bir konvansiyondan ibaret — manifest'te o dosyaları adlandıran hiçbir şey yok. convert.0 içindeki import'lar doğrudan internal/decoder.0'a ulaşır.
Build ve Çalıştırma
Bir paketin içindeyken yaygın iş akışları:
zero check # tüm ağacı type-check et
zero run # varsayılan target'ı build et ve çalıştır
zero run convert # belirli bir target'ı build et ve çalıştır
zero build # varsayılan target'ı build et
zero build --all # tüm target'ları build et (desteklendiğinde)
zero test # her test target'ını çalıştır
CLI zero.json'ı okur, ne yapacağını anlar ve devam eder. Bir paket içinde çalışırken yolları nadiren yazmanız gerekir.
Birden Fazla Kaynak Dosyası: Hızlı Bir Örnek
Diyelim src/main.0, src/math.0'daki bir yardımcıyı çağırıyor. Yardımcı dosya:
pub fun double(value: i32) -> i32 {
return value * 2
}
Giriş dosyası:
pub fun main(world: World) -> Void raises {
let result = double(21)
if result == 42 {
check world.out.write("forty two\n")
}
}
zero run ile çalıştırın. Compiler bu basit durumda explicit bir import bildirimi olmadan double referansını kaynak ağacın geri kalanına karşı çözer. Paketler büyüdükçe explicit bir imports sistemi modüller arası görünürlüğü yönetir — import söz dizimi 1.0 öncesi en çok değişebilecek alanlardan biri olduğu için güncel Zero dokümanlarına bakın.
Git'e Eklenmemesi Gerekenler
Bir Zero paketi için tipik bir .gitignore genellikle şunları içerir:
# build artifact'leri ve cache'ler
/build/
/target/
# editor artıkları
.DS_Store
*.swp
Build çıktı dizininin tam adı farklı olabilir — güncel toolchain dokümanlarına bakın — ama kural şu: kaynak girer, build artifact'leri dışarıda kalır.
Paketleri Paylaşmak
Zero pre-1.0 ve bir paket registry'si henüz kararlı yüzeyin parçası değil. Şimdilik bir paketi paylaşmanın pratik yolları:
- Git: repo'yu clone'layın ve karşısında
zero checkçalıştırın. - Vendored kopya: kaynağın bir kopyasını başka bir projeye düşürün.
Bir registry geldiğinde paket referansları muhtemelen zero.json'daki bir dependencies alanına taşınacak. Bunu ileriye dönük bir özellik olarak görün, bugün üzerine script yazılacak bir şey olarak değil.
Sırada: Dil Temelleri
Artık gerçek bir Zero projesini organize etmek için gereken her şeye sahipsiniz. Bir sonraki bölüm dilin kendisine yakınlaşıyor — Zero'da değerlere isim verme yolu olan let bağlamalarıyla başlıyor.
Sıkça Sorulan Sorular
Zero paketi nedir?
Bir Zero paketi, bir zero.json manifest'i ve .0 kaynak dosyalarını içeren bir src/ klasörü barındıran bir dizindir. Manifest, paketin adını, sürümünü ve bir veya birden fazla 'target'ını bildirir — her target, compiler'a kaynaktan bir şey (executable, library, test binary) nasıl üretileceğini söyler.
Yeni bir Zero paketi nasıl oluştururum?
zero new <template> <name> çalıştırın, örneğin zero new cli hello. CLI; bir zero.json, bir src/main.0 ve seçilen template'in gerektirdiği diğer dosyalarla birlikte bir dizin iskeletler. Sonrasında paketin içinde zero check, zero run ve zero build çalıştırabilirsiniz.
zero.json neler içerir?
zero.json neler içerir?En az bir name ve version içeren bir package nesnesi ve paketin ürettiği her şeyi tanımlayan bir targets nesnesi. Bir target'ın bir kind'ı (executable için exe gibi) ve giriş kaynak dosyasını gösteren bir main'i vardır. Tek bir manifest içinde birden çok target bildirebilirsiniz.
Tek bir Zero paketinde birden fazla target olabilir mi?
Evet. Bir paket istediğiniz kadar target bildirebilir — örneğin bir CLI için bir exe target, yeniden kullanılabilir bir library için bir lib target ve bir ya da daha fazla test target. Her target'ın kendi giriş noktası src/ altındadır ve CLI'dan ayrı ayrı build/run edilebilir.
Compiler build çıktısını nereye koyar?
Build artifact'leri paketin içindeki bir build dizinine düşer (kesin yol implementation'a özgüdür ve Zero pre-1.0 olduğu sürece değişebilir). src/ altındaki kaynak ağacı asla değiştirilmez. Build dizinini geçici sayın — onu git'e commit etmek kötü bir fikir.