Ana içeriğe geç

ch01-03-hello-cargo

Merhaba, Cargo!

Cargo, Rust'un derleme sistemi ve paket yöneticisidir. Çoğu Rust geliştiricisi, Cargo'yu Rust projelerini yönetmek için kullanır çünkü Cargo, kodunuzu derleme, kodunuzun bağımlı olduğu kütüphaneleri indirme ve bu kütüphaneleri derleme gibi birçok görevi sizin için halleder. (Kodunuzun ihtiyaç duyduğu kütüphanelere bağımlılıklar diyoruz.)

Şu ana kadar yazdığımız en basit Rust programları, hiç bağımlılığa sahip değildir. "Merhaba, dünya!" projesini Cargo ile inşa etseydik, yalnızca kodunuzu derleyen Cargo'nun kısmını kullanırdık. Daha karmaşık Rust programları yazdıkça bağımlılıklar ekleyeceksiniz ve Cargo kullanarak bir proje başlatıyorsanız, bağımlılıkları eklemek çok daha kolay olacaktır.

Rust projelerinin büyük çoğunluğu Cargo'yu kullandığı için, bu kitabın geri kalanı sizin de Cargo kullanıyormuşsunuz gibi varsaymaktadır. Cargo, resmi kurulum yöntemlerini kullanarak Rust yüklediyseniz, Rust ile birlikte kurulu gelir. Rust'ı başka bir yöntemle yüklediyseniz, aşağıdakini terminalinize yazarak Cargo'nun kurulu olup olmadığını kontrol edin:

$ cargo --version

Bir sürüm numarası görüyorsanız, size ait! command not found gibi bir hata görüyorsanız, yükleme yönteminizle ilgili belgeleri kontrol ederek Cargo'yu ayrı olarak nasıl yükleyeceğinizi belirleyin.

Cargo ile Proje Oluşturma

Cargo kullanarak yeni bir proje oluşturalım ve bunun orijinal “Merhaba, dünya!” projemizden nasıl farklı olduğunu görelim. projects dizinine geri dönün (veya kodunuzu saklamak için karar verdiğiniz yere). Ardından, herhangi bir işletim sisteminde aşağıdakileri çalıştırın:

$ cargo new hello_cargo
$ cd hello_cargo

İlk komut, hello_cargo adında yeni bir dizin ve proje oluşturur. Projemize hello_cargo adını verdik ve Cargo, dosyalarını aynı isme sahip bir dizinde oluşturur.

hello_cargo dizinine gidin ve dosyaları listeleyin. Cargo'nun bizim için iki dosya ve bir dizin oluşturduğunu göreceksiniz: bir Cargo.toml dosyası ve içinde main.rs dosyası bulunan bir src dizini.

Ayrıca yeni bir Git deposu başlatmış ve bir .gitignore dosyası oluşturmuştur. Eğer mevcut bir Git deposu içinde cargo new komutunu çalıştırırsanız, Git dosyaları oluşturulmaz; bu davranışı, cargo new --vcs=git kullanarak geçersiz kılabilirsiniz.

not

Git, yaygın bir sürüm kontrol sistemidir. cargo new komutunu farklı bir sürüm kontrol sistemi veya hiç sürüm kontrol sistemi kullanması için --vcs bayrağını kullanarak değiştirebilirsiniz. Mevcut seçenekleri görmek için cargo new --help komutunu çalıştırın.

Tercih ettiğiniz metin düzenleyicisinde Cargo.toml dosyasını açın. Dosya, 1-2 numaralı listedeki koda benzer görünmelidir.

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"

# Daha fazla anahtar ve tanımları için https://doc.rust-lang.org/cargo/reference/manifest.html adresine bakın

[dependencies]

Bu dosya, Cargo'nun yapılandırma formatı olan TOML (Tom'un Bariz, Minimal Dili) formatındadır.

İlk satır, [package], takip eden ifadelerin bir paketi yapılandırdığını gösteren bir bölüm başlığıdır. Bu dosyaya daha fazla bilgi eklediğimizde, diğer bölümleri ekleyeceğiz.

Sonraki üç satır, Cargo'nun programınızı derlemesi için ihtiyaç duyduğu yapılandırma bilgilerini ayarlar: isim, sürüm ve kullanılması gereken Rust sürümü. edition anahtarını Ek E bölümünde konuşacağız.

Son satır, [dependencies], projenizin bağımlılıklarını listelemeniz için bir bölümün başlangıcıdır. Rust'ta, kod paketlerine crate denir. Bu proje için başka crate'lere ihtiyacımız yok ama 2. bölümdeki ilk projede ihtiyaç duyacağız; dolayısıyla o zaman bu bağımlılıklar bölümünü kullanacağız.

Şimdi src/main.rs dosyasını açın ve bir göz atın:

Dosya Adı: src/main.rs

fn main() {
println!("Merhaba, dünya!");
}

Cargo, sizin için bir “Merhaba, dünya!” programı oluşturdu, tıpkı 1-1 numaralı listedeki gibi! Şu ana kadar, projemiz ile Cargo'nun oluşturduğu proje arasındaki farklar, Cargo'nun kodu src dizinine yerleştirmesi ve üst dizinde bir Cargo.toml yapılandırma dosyası bulundurmasıdır.

Cargo, kaynak dosyalarınızın src dizininde yer almasını bekler. Üst düzey proje dizini, yalnızca README dosyaları, lisans bilgileri, yapılandırma dosyaları ve kodunuzla ilgili olmayan diğer her şey için kullanılır. Cargo kullanmak, projelerinizi organize etmenize yardımcı olur. Her şeyin bir yeri vardır ve her şey yerindedir.

ipucu

Eğer “Merhaba, dünya!” projesinde olduğu gibi Cargo kullanmayan bir projeye başladıysanız, onu Cargo kullanan bir projeye dönüştürebilirsiniz. Proje kodunu src dizinine taşıyın ve uygun bir Cargo.toml dosyası oluşturun. Bu Cargo.toml dosyasını almanın kolay bir yolu, cargo init komutunu çalıştırmaktır; bu da otomatik olarak dosyayı oluşturacaktır.

Cargo Projesi Oluşturma ve Çalıştırma

Şimdi, “Merhaba, dünya!” programını Cargo ile derleyip çalıştırdığımızda neyin farklı olduğuna bakalım! hello_cargo dizininizden projenizi derlemek için aşağıdaki komutu girin:

$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

Bu komut, mevcut dizininizde değil, target/debug/hello_cargo (veya Windows'ta target\debug\hello_cargo.exe) içinde bir çalıştırılabilir dosya oluşturur. Varsayılan derleme bir hata ayıklama derlemesidir, bu yüzden Cargo, ikili dosyayı debug adında bir dizinde saklar. Çalıştırılabilir dosyayı bu komutla çalıştırabilirsiniz:

$ ./target/debug/hello_cargo # veya Windows üzerinde .\target\debug\hello_cargo.exe
Merhaba, dünya!

Her şey yolunda giderse, Merhaba, dünya! terminale yazdırılmalıdır. cargo build komutunu ilk kez çalıştırdığınızda, Cargo ayrıca üst düzeyde yeni bir dosya oluşturur: Cargo.lock. Bu dosya, projenizdeki bağımlılıkların tam sürümlerini izler. Bu projenin bağımlılıkları olmadığı için dosya biraz seyrek görünüyor. Bu dosyayı manuel olarak değiştirmeye gerek yoktur; Cargo içeriklerini sizin için yönetir.

tehlike

cargo build komutuyla bir projeyi derledik ve ./target/debug/hello_cargo ile çalıştırdık, ancak tüm bu işlemi tek bir komutla cargo run da kullanabiliriz:

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Merhaba, dünya!

cargo run kullanmak, cargo build çalıştırmak ve ardından ikili dosyanın tam yolunu kullanmayı hatırlamak zorunda kalmaktan daha uygundur, bu yüzden çoğu geliştirici cargo run kullanır.

Bu kez Cargo'nun hello_cargo'yu derlediğine dair bir çıktı görmediğimizde, Cargo dosyaların değişmediğini anladı, bu yüzden sadece ikili dosyayı çalıştırdı. Eğer kaynak kodunuzu değiştirmiş olsaydınız, Cargo projeyi çalıştırmadan önce yeniden derleyecekti ve bu çıktıyı görecektiniz:

$ cargo run
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
Running `target/debug/hello_cargo`
Merhaba, dünya!

Cargo'nun ayrıca cargo check adlı bir komutu vardır. Bu komut, kodunuzu derleyip derlemediğini hızlı bir şekilde kontrol eder, ancak çalıştırılabilir bir dosya üretmez:

$ cargo check
Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

Neden bir çalıştırılabilir dosya istemeyesiniz? Çoğunlukla, cargo check, bir çalıştırılabilir dosya üretme adımını atladığı için cargo build komutundan çok daha hızlıdır. Kodu yazarken sürekli olarak işlemlerinizi kontrol ediyorsanız, cargo check kullanmak, projenizin hala derlenip derlenmediğini öğrenme sürecini hızlandırır! Bu nedenle, birçok Rust geliştiricisi, programlarını yazarken aralıklarla cargo check çalıştırır ve çalıştırılabilir dosyayı kullanmaya hazır olduklarında cargo build çalıştırır.

Şimdiye Kadar Öğrendiklerimiz

Şimdiye kadar Cargo hakkında öğrendiklerimizi özetleyelim:

  • cargo new kullanarak bir proje oluşturabiliriz.
  • cargo build kullanarak bir projeyi derleyebiliriz.
  • cargo run kullanarak bir projeyi tek adımda derleyip çalıştırabiliriz.
  • cargo check kullanarak hataları kontrol etmek için bir ikili dosya oluşturmadan derleyebiliriz.
  • Derleme sonucunu kodumuzla aynı dizinde saklamak yerine Cargo, target/debug dizininde saklar.

Cargo kullanmanın bir diğer avantajı da, komutların hangi işletim sisteminde çalışırsanız çalışın aynı olmasıdır. Bu nedenle, bu noktada Linux ve macOS ile Windows için özel talimatlar vermeyeceğiz.

Yayın için Derleme

Projeniz nihayet yayın için hazır olduğunda, cargo build --release komutunu kullanarak onu optimize edilmiş bir şekilde derleyebilirsiniz. Bu komut, target/release içinde bir çalıştırılabilir dosya oluşturur, target/debug yerine. Optimizasyonlar, Rust kodunuzun daha hızlı çalışmasını sağlarken, bunları etkinleştirmek, programınızın derlenme süresini uzatır. Bu nedenle, geliştirme sırasında hızlı ve sık yeniden derleme isteği için bir profil, bir de kullanıcıya vermek istediğiniz son program için başka bir profil vardır; bu profil, yeniden derlenmeyecek ve mümkün olduğunca hızlı çalışacaktır. Kodu çalıştırma süresini ölçüyorsanız, cargo build --release komutunu çalıştırın ve target/release içindeki çalıştırılabilir dosyayla ölçüm yapın.

Cargo’nun Alışkanlık Olarak Kullanımı

Basit projelerde, Cargo'nun yalnızca rustc kullanmaktan daha fazla değer sunduğu görülmüyor, ancak programlarınız daha karmaşık hale geldikçe değeri kanıtlayacaktır. Programlar birden fazla dosyaya veya bir bağımlılığa ihtiyaç duyduğunda, Cargo'nun derlemeyi koordine etmesi çok daha kolaydır.

Not: hello_cargo projesi basit olmasına rağmen, şimdi Rust kariyerinizin geri kalanında kullanacağınız birçok gerçek aracı kullanıyor. Aslında, mevcut projeler üzerinde çalışmak için kodu Git kullanarak kontrol etmek, o projeye geçmek ve derlemek için şu komutları kullanabilirsiniz:

$ git clone example.org/someproject
$ cd someproject
$ cargo build

Cargo hakkında daha fazla bilgi için belgelere göz atabilirsiniz.

Özet

Rust yolculuğunuzda harika bir başlangıç yaptınız! Bu bölümde şunları öğrendiniz:

  • rustup kullanarak en son kararlı Rust sürümünü yüklemek
  • Daha yeni bir Rust sürümüne güncellemek
  • Yerel olarak yüklenmiş belgelere erişmek
  • rustc kullanarak doğrudan bir “Merhaba, dünya!” programı yazmak ve çalıştırmak
  • Cargo'nun alışkanlıkları ile yeni bir proje oluşturmak ve çalıştırmak

Bu, daha kapsamlı bir program inşa etmek ve Rust kodu yazmayı ve okumayı öğrenmek için harika bir zamandır. Bu nedenle, 2. bölümde bir tahmin oyunu programı yapacağız. Rust'taki yaygın programlama kavramlarının nasıl çalıştığını öğrenmeye başlamak isterseniz, 3. bölüme bakın ve sonra 2. bölüme geri dönün.