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

Gelişmiş taşıma stratejileri

Taşımalar nasıl çalışır?

cargo fix --edition, projenizde cargo check komutuna denk bir calistirma yapip, bir sonraki surumde derlenmeyebilecek kodu tespit eden ozel lintleri etkinlestirerek calisir. Bu lint’ler, kodu hem mevcut surumle hem de sonraki surumle uyumlu hale getirmek icin nasil degistirmeniz gerektigine dair yonlendirmeler icerir. cargo fix bu degisiklikleri kaynak koda uygular, ardindan duzeltmelerin ise yaradigini dogrulamak icin cargo check komutunu yeniden calistirir. Duzeltmeler basarisiz olursa yaptigi degisiklikleri geri alir ve bir uyari gosterir.

Kodu hem mevcut hem de sonraki surumle ayni anda uyumlu hale getirmek, tasimayi parca parca yapmayi kolaylastirir. Otomatik tasima tamamen basarili olmazsa ya da elle mudahale isterse, Cargo.toml dosyasini henuz degistirmeden once orijinal surumde kalarak adim adim ilerleyebilirsiniz.

cargo fix --edition tarafindan uygulanan lint’ler bir lint grubunun parcasidir. Ornegin 2018’den 2021’e gecerken Cargo, kodu duzeltmek icin rust-2021-compatibility lint grubunu kullanir. Tasimada tek tek lint kullanmayla ilgili ipuclari icin asagidaki Kirik kodla parcali tasima bolumune bakin.

cargo fix, cargo check komutunu birden fazla kez calistirabilir. Ornegin bir duzeltme kumesi uygulandiktan sonra, yeni uyarilar ortaya cikabilir ve ek duzeltmeler gerekebilir. Cargo bu sureci, yeni uyari uretilmeyene kadar tekrarlar.

Birden çok yapılandırmayı taşımak

cargo fix ayni anda yalnizca tek bir yapilandirmayla calisabilir. Cargo features veya kosullu derleme kullaniyorsaniz, farkli bayraklarla cargo fix komutunu birden fazla kez calistirmaniz gerekebilir.

Ornegin farkli platformlarda farkli kodu dahil etmek icin #[cfg] ozniteliklerini kullanan bir kodunuz varsa, farkli hedefleri duzeltmek icin cargo fix komutunu --target secenegiyle calistirmaniz gerekebilir. Elinizde capraz derleme yoksa bu, kodunuzu makineler arasinda tasimanizi da gerektirebilir.

Benzer bicimde, #[cfg(feature = "benim-istege-bagli-seyim")] gibi Cargo ozelliklerine bagli kosullariniz varsa, bu ozellik kapilarinin arkasindaki tum kodu da tasiyabilmek icin --all-features bayragini kullanmaniz tavsiye edilir. Ozellik kodunu tek tek tasimak istiyorsaniz --features bayragiyla her birini ayri ayri ele alabilirsiniz.

Büyük bir projeyi veya çalışma alanını taşımak

Sorunlarla karsilastiginizda sureci kolaylastirmak icin buyuk bir projeyi parca parca tasiyabilirsiniz.

Bir Cargo çalışma alanında her paket kendi surumunu tanimlar; bu yuzden surec dogal olarak paketleri tek tek tasimayi destekler.

Bir Cargo paketi icinde ise tum paketi bir anda tasiyabilir ya da tek tek Cargo hedeflerini tasiyabilirsiniz. Ornegin birden fazla ikili, test ve ornek varsa, cargo fix --edition ile yalnizca belirli bir hedefi tasimak icin hedef secim bayraklarini kullanabilirsiniz. Varsayilan olarak cargo fix, --all-targets kullanir.

Daha da ileri durumlar icin, Cargo.toml icinde her hedefin surumunu ayri ayri su sekilde belirleyebilirsiniz:

[[bin]]
name = "benim-ikilim"
edition = "2018"

Bu genelde gerekli olmaz; ancak cok sayida hedefiniz varsa ve hepsini bir arada tasimakta zorlanıyorsaniz ise yarayan bir secenektir.

Kırık kodla parçalı taşıma

Bazen derleyicinin onerdigi duzeltmeler beklendigi gibi calismaz. Boyle bir durumda Cargo ne oldugunu ve hangi hatayla karsilasildigini bildiren bir uyari yazar. Ancak varsayilan olarak yaptigi degisiklikleri otomatik geri alir. Kodu kirik halde birakip sorunu elle cozmek bazen daha faydali olur. Bazi duzeltmeler dogru olabilir; kirik olan duzeltme de buyuk olcude dogru olup sadece kucuk bir el ayari gerektiriyor olabilir.

Bu durumda Cargo’ya degisiklikleri geri almamasini soylemek icin cargo fix ile birlikte --broken-code secenegini kullanin. Sonra hatayi elle inceleyip neyin duzeltilmesi gerektigini arastirabilirsiniz.

Bir projeyi adim adim tasimanin baska bir yolu da duzeltmeleri tek tek uygulamaktir. Bunun icin tekil lint’leri uyari olarak ekleyebilir, ardindan ya cargo fix komutunu (--edition olmadan) calistirabilir ya da editorunuz/IDE’niz “Hizli Duzeltme” benzeri bir ozellik sunuyorsa onun onerilerini uygulayabilirsiniz.

Ornegin 2018 surumu, cakisan anahtar kelimeleri duzeltmek icin keyword-idents lint’ini kullanir. Her crate’in en ustune (src/lib.rs veya src/main.rs basina) #![warn(keyword_idents)] ekleyebilirsiniz. Ardindan cargo fix yalnizca bu lint’in onerilerini uygular.

Her surum icin hangi lint’lerin etkinlestirildigini lint grubu sayfasindan gorebilir veya rustc -Whelp komutunu calistirabilirsiniz.

Makroları taşımak

Bazi makrolar, bir sonraki surum icin duzeltilirken elle mudahale gerektirebilir. Ornegin cargo fix --edition, bir sonraki surumde gecersiz olacak sozdizimini ureten bir makroyu otomatik olarak duzeltemeyebilir.

Bu hem proc macrolar hem de macro_rules tarzindaki makrolar icin sorun olabilir. macro_rules makrolari bazen ayni crate icinde kullaniliyorsa otomatik guncellenebilir, ama bunun mumkun olmadigi cesitli durumlar vardir. Proc macro’lar ise genel olarak hic otomatik duzeltilemez.

Ornegin, 2015’ten 2018’e tasidigimiz bir crate icinde su yapay foo makrosunun bulundugunu varsayalim. foo otomatik olarak duzeltilmez:

#![allow(unused)]
fn main() {
#[macro_export]
macro_rules! foo {
    () => {
        let dyn = 1;
        println!("deger {}", dyn);
    };
}
}

Bu makro 2015 surumlu bir crate icinde tanimlandiginda, makro hijyeni (asagida anlatiliyor) sayesinde diger tum surumlerdeki crate’lerden de kullanilabilir. 2015’te dyn normal bir tanimlayicidir ve kisitsiz kullanilabilir.

Ancak 2018’de dyn artik gecerli bir tanimlayici degildir. 2018’e gecmek icin cargo fix --edition kullandiginizda Cargo hic uyari ya da hata gostermeyebilir. Yine de foo, herhangi bir crate icinden cagrildiginda calismayacaktir.

Makrolariniz varsa, makronun sozdizimini tam olarak kapsayan testlerinizin olmasi tavsiye edilir. Ayrica makrolari farkli surumlerdeki crate’lere aktarip kullanarak her yerde dogru calistiklarini test etmek de iyi olur. Bir sorunla karsilasirsaniz, bu rehberin ilgili bolumlerini okuyup kodun tum surumlerde calisacak sekilde nasil degistirilecegini anlamaniz gerekir.

Makro hijyeni

Makrolar, iclerindeki token’lari hangi surumden geldiklerini isaretleyerek “surum hijyeni” denen bir sistem kullanir. Bu sayede harici makrolar, hangi surumden cagrildigini dert etmeden farkli surumlerdeki crate’lerden cagrilabilir.

Yukaridaki ornekte dyn adini tanimlayici olarak kullanan macro_rules makrosuna daha yakindan bakalim. Eger bu makro 2015 surumunu kullanan bir crate’te tanimlandiysa, dyn 2018 crate’inde anahtar kelime olsa bile, normal sartlarda sozdizim hatasi verecek bu kod yine de calisir. let dyn = 1; token’lari 2015’e ait olarak isaretlenir ve derleyici bu bilgi genisleme nerede olursa olsun hatirlar. Ayriştirici, bunu nasil yorumlayacagini token’in surumune bakarak anlar.

Sorun, makronun tanimlandigi crate’in surumu 2018’e cevrildiginde ortaya cikar. Bu kez token’lar 2018 etiketi tasir ve artik ayrıştırılamaz. Ama makroyu kendi crate’imizde hic cagrimadigimiz icin cargo fix --edition, makroyu inceleme ve duzeltme firsati bulamaz.

Belgelendirme testleri

Su an cargo fix, belgelendirme testlerini guncelleyemez. Cargo.toml icinde surumu guncelledikten sonra her seyin hala gectiginden emin olmak icin cargo test calistirmalisiniz. Belgelendirme testleriniz yeni surumde desteklenmeyen bir sozdizimi kullaniyorsa bunlari elle guncellemeniz gerekir.

Nadir durumlarda her test icin surumu elle ayarlayabilirsiniz. Ornegin uc ters tirnak uzerinde edition2018 aciklamasini kullanarak rustdoc’a hangi surumu kullanacagini soyleyebilirsiniz.

Üretilen kod

Otomatik duzeltmelerin uygulanamadigi bir baska alan, derleme zamaninda Rust kodu ureten bir build script’iniz olmasidir (Kod uretimi orneklerinden birine bakin). Bu durumda bir sonraki surumde calismayan kod ortaya cikarsa, uyumlu kod uretmesi icin build script’i elle degistirmeniz gerekir.

Cargo kullanmayan projeleri taşımak

Eger projeniz derleme sistemi olarak Cargo kullanmiyorsa bile, bir sonraki surume tasinirken otomatik lint’lerden yardim alma sansiniz olabilir. Bunun icin yukarida aciklandigi gibi uygun lint grubunu etkinlestirebilirsiniz. Ornegin #![warn(rust_2021_compatibility)] ozniteligini ya da -Wrust-2021-compatibility veya --force-warns=rust-2021-compatibility komut satiri bayragini kullanabilirsiniz.

Siradaki adim, bu lint’leri kodunuza uygulamaktir. Bunun icin birkac secenek vardir:

  • Uyarilari elle okuyup derleyicinin onerdigi duzeltmeleri uygulamak.
  • Onerileri otomatik uygulayabilen bir editor veya IDE kullanmak. Ornegin Visual Studio Code, Rust Analyzer eklentisi ile “Hizli Duzeltme” baglantilarini kullanip onerileri otomatik uygulayabilir. Bircok baska editor ve IDE’de de benzer imkanlar vardir.
  • rustfix kutuphanesini kullanarak bir tasima araci yazmak. Bu, Cargo’nun derleyiciden gelen JSON iletilerini alip kaynak kodu degistirmek icin ic tarafta kullandigi kutuphanedir. Kutuphanenin nasil kullanildigina dair ornekler icin examples dizinine bakin.

Yeni bir sürümde deyimsel kod yazmak

Surumler sadece yeni ozellikler eklemek ve eskilerini kaldirmakla ilgili degildir. Her programlama dilinde oldugu gibi deyimler zamanla degisir; Rust da bunun disinda degildir. Eski kod derlenmeye devam etse de bugunun anlayisina gore farkli deyimlerle yazilmis olabilir.

Ornegin Rust 2015’te harici crate’ler su sekilde extern crate ile listelenmelidir:

// src/lib.rs
extern crate rand;

Rust 2018’de bu ogeleri eklemek artik gerekli degildir.

cargo fix, bu deyimlerden bazilarini yeni sozdizimine otomatik olarak tasimak icin --edition-idioms secenegini sunar.

Uyari: Mevcut “deyim lint“lerinin bazi sorunlari oldugu biliniyor. Yanlis oneriler uretebilir ve bu oneriler derlenmeyebilir. Su anki lint’ler sunlardir:

Asagidaki yonlendirmeler, ancak birkac derleyici/Cargo hatasiyla ugrasmayi goze alan kisilere onerilir. Sorun cikarsa, mumkun olan en fazla ilerlemeyi saglamak icin yukarida anlatilan --broken-code secenegini deneyebilir, kalanlari da elle duzeltebilirsiniz.

Bu uyarilari bir kenara koyarsak, Cargo’ya kod parcacigimizi su komutla duzeltmesini soyleyebiliriz:

cargo fix --edition-idioms

Sonrasinda src/lib.rs icindeki extern crate rand; satiri kaldirilir.

Boylece daha deyimsel bir koda gecmis oluruz ve bunu elle yapmak zorunda kalmayiz.