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.
rustfixkutuphanesini 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 icinexamplesdizinine 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:
- Surum 2018:
- Surum 2021 icin herhangi bir deyim lint’i yoktur.
Asagidaki yonlendirmeler, ancak birkac derleyici/Cargo hatasiyla ugrasmayi goze alan kisilere onerilir. Sorun cikarsa, mumkun olan en fazla ilerlemeyi saglamak icin yukarida anlatilan
--broken-codesecenegini 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.