Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Paketler ve Crate’ler

Modül sisteminin ele alacağımız ilk parçaları paketler ve crate’lerdir.

Bir crate, Rust derleyicisinin tek seferde ele aldığı en küçük kod parçasıdır; yani bir derleme birimidir (compilation unit). cargo yerine doğrudan rustc çalıştırıp derleyiciye tek bir kaynak kod dosyası iletseniz bile (Bölüm 1’deki “Rust Programlamanın Temelleri” kısmında yaptığımız gibi), derleyici bu dosyayı bir crate olarak kabul eder. Crate’ler modüller içerebilir ve ilerleyen alt bölümlerde göreceğimiz gibi bu modüller, crate ile birlikte derlenen başka dosyalarda tanımlanmış olabilir.

Bir crate iki biçimden birinde olabilir: ikili crate (binary crate) veya kütüphane crate’i (library crate). İkili crate’ler, komut satırı aracı veya sunucu gibi doğrudan çalıştırılabilir bir dosyaya derleyebildiğiniz programlardır. Her ikili crate’in, program başlatıldığında ne yapılacağını belirleyen main adında bir fonksiyona sahip olması gerekir. Şimdiye kadar oluşturduğumuz tüm crate’ler ikili crate’lerdi.

Kütüphane crate’lerinin bir main fonksiyonu yoktur ve bu crate’ler çalıştırılabilir bir dosyaya derlenmez. Bunun yerine, birden fazla projeyle paylaşılması amaçlanan işlevselliği tanımlarlar. Örneğin, Bölüm 2’de kullandığımız rand crate’i rastgele sayı üretme işlevselliği sunar. Rust geliştiricileri çoğu zaman “crate” dediklerinde kütüphane crate’ini kasteder ve “crate” terimini genel programlama kavramı olan “kütüphane” ile eş anlamlı kullanırlar.

Crate kökü (crate root), Rust derleyicisinin derlemeye başladığı ve crate’inizin kök modülünü oluşturan kaynak dosyadır (modülleri “Modüllerle Kapsam ve Gizliliği Kontrol Etme” kısmında ayrıntılı olarak inceleyeceğiz).

Bir paket (package), belirli bir işlevsellik kümesi sunan bir veya daha fazla crate’ten oluşan bir bütündür. Her paket, içindeki crate’lerin nasıl derleneceğini tanımlayan bir Cargo.toml dosyası barındırır. Aslında Cargo’nun kendisi de kodunuzu derlemek için kullandığınız komut satırı aracına ait ikili crate’i barındıran bir pakettir. Cargo paketi aynı zamanda bu ikili crate’in bağımlı olduğu bir kütüphane crate’i de içerir. Başka projeler de Cargo komut satırı aracıyla aynı mantığı kullanmak için Cargo’nun kütüphane crate’ine bağımlı olabilir.

Bir paket dilediğiniz sayıda ikili crate içerebilir; ancak en fazla bir kütüphane crate’i barındırabilir. Öte yandan bir paket, ister kütüphane ister ikili crate olsun, en az bir crate içermek zorundadır.

Bir paket oluşturduğumuzda neler olduğuna adım adım bakalım. Önce cargo new benim-projem komutunu giriyoruz:

$ cargo new benim-projem
     Created binary (application) `benim-projem` package
$ ls benim-projem
Cargo.toml
src
$ ls benim-projem/src
main.rs

cargo new benim-projem komutunu çalıştırdıktan sonra Cargo’nun neleri oluşturduğunu görmek için ls komutunu kullanıyoruz. Proje dizini olan benim-projem içinde, bize bir paket kazandıran Cargo.toml dosyası yer alır. Ayrıca main.rs dosyasını barındıran bir src dizini de bulunur. Cargo.toml dosyasını metin düzenleyicinizde açarsanız src/main.rs dosyasından hiç söz edilmediğini görürsünüz. Cargo, src/main.rs dosyasının paketle aynı adı taşıyan bir ikili crate’in crate kökü olduğu kuralını izler. Benzer şekilde Cargo, paket dizininde src/lib.rs dosyası varsa paketin yine kendisiyle aynı adı taşıyan bir kütüphane crate’i içerdiğini ve crate kökünün src/lib.rs olduğunu bilir. Cargo, kütüphaneyi veya ikili dosyayı derlemek üzere bu crate kök dosyalarını rustc derleyicisine iletir.

Burada yalnızca src/main.rs dosyasını barındıran bir paketimiz var; yani paket yalnızca benim-projem adında tek bir ikili crate içeriyor. Bir pakette hem src/main.rs hem de src/lib.rs bulunuyorsa o paket, her ikisi de paketle aynı adı taşıyan iki crate içerir: bir ikili crate ve bir kütüphane crate’i. Ayrıca src/bin dizinine dosyalar yerleştirerek bir paketin birden fazla ikili crate barındırmasını sağlayabilirsiniz; bu dizindeki her dosya ayrı bir ikili crate olur.

Not: Gerçek dünya Rust projelerinde (Bölüm 12’de de uygulayacağımız gibi) aynı pakette hem src/lib.rs hem de src/main.rs bulundurmak yaygın bir mimaridir. Bu düzende paylaşılan asıl iş mantığı src/lib.rs kütüphane crate’ine yerleştirilir; src/main.rs ikili crate’i ise yalnızca komut satırı argümanlarını okuyup kütüphanedeki açık (pub) öğeleri çağıran ince bir giriş noktası olarak tutulur. Paket adında benim-projem gibi kısa çizgi varsa Rust kodunda kütüphane crate’ine alt çizgiyle, yani benim_projem adıyla başvurulduğunu unutmayın. Doğrudan bir kütüphane paketi oluşturmak için cargo new --lib komutunu kullanabilirsiniz; src/bin/ dizinine birden fazla ikili crate (örneğin src/bin/sunucu.rs ve src/bin/istemci.rs) eklediğinizde ise çalıştırmak istediğiniz hedefi cargo run --bin sunucu komutuyla seçebilirsiniz.