Alig telt el hat hét az 1.68 óta, és itt is a következő stabil kiadás: a Rust 1.69 2023. április 20-án jelent meg a szokásos hathetes release-ciklus szerint. Ez a verzió nem olyan, ami a cikkek élére kerül nagybetűs feature-ökkel — inkább azok közé tartozik, amikről az ember csak akkor veszi észre, hogy mennyit segítettek, amikor visszatér egy régebbi toolchain-re, és hirtelen minden lassabb.
Build script-ek: végre inkrementális fordítás
Az 1.69 egyik legkonkrétabb, mindennapi munkában érzékelhető változása, hogy a Cargo mostantól sokkal okosabban bánik a build script-ekkel (a build.rs fájlokkal). Korábban egy build script módosítása gyakran azzal járt, hogy a Cargo szükségtelenül nagy részét újra lefordította a build script saját függőségi gráfjának, még akkor is, ha a tényleges kódváltozás minimális volt.
A build script fordítási folyamata mostantól jobban illeszkedik az inkrementális fordítás logikájához, ami azt jelenti, hogy ha csak a build.rs egy apró részét módosítod, nem kell az egész build script crate-et és annak függőségeit újra átfésülni. Ez különösen érzékelhető azoknál a projekteknél, ahol a build.rs maga is jelentős logikát tartalmaz — gondolj csak a bindgen-t vagy protobuf-kódgenerálást használó crate-ekre.
Ha a saját projektedben a build.rs fordítása szokott sokáig tartani, érdemes a frissítés után egy tiszta cargo clean + újrafordítás után megnézni az időket — sok esetben már az első inkrementális változás után érezhető a különbség.
A gyakorlatban ez azt jelenti, hogy ha nagyobb monorepo-ban dolgozol sok build script-et használó crate-tel, a cargo build ciklusaid rövidebbek lesznek, különösen a fejlesztés közbeni „módosítok egy sort, újrafordítok” típusú munkafolyamatban.
Javított és megbízhatóbb cargo fix
A másik fontos terület a cargo fix parancs, amit sokan használnak deprecation warning-ok automatikus kijavítására, vagy edition-migrációk (pl. 2018 → 2021) elvégzésére. Az 1.69-ben a cargo fix több edge case-t is helyesen kezel már, amik korábban vagy hibás kódot generáltak, vagy egyszerűen kihagyták a javítást csendben.
Konkrétan a cargo fix most jobban kezeli azokat a helyzeteket, amikor egy fájlban több, egymással ütköző lint-javítás is alkalmazható lenne — korábban ilyenkor előfordult, hogy a tool csak az egyiket alkalmazta, és a másik warning érintetlenül maradt egy következő futásig. Emellett a hibaüzenetek is informatívabbak lettek: ha egy fix nem alkalmazható automatikusan (pl. mert a kód közben kézzel módosult), most pontosabb visszajelzést kapsz arról, miért maradt ki a javítás.
A cargo fix továbbra sem varázseszköz — mindig érdemes git diff-fel átnézni, mit módosított, mielőtt commitolod. Az automatikus javítás jó kiindulópont, de nem helyettesíti a code review-t.
Íme egy egyszerű példa, amit a cargo fix --edition-idioms (vagy sima cargo fix) rendbe tud szedni egy elavult mintázatnál:
// Régi, warning-ot generáló minta
fn describe(x: Option<i32>) -> String {
match x {
Some(v) => format!("érték: {}", v),
None => String::from("nincs érték"),
}
}
Ha a let-else szintaxist (ami az 1.65 óta stabil) preferálod a korai visszatéréshez, a cargo fix bizonyos lint-javaslatok mellett most konzisztensebben ajánl fel ilyen átalakításokat is a clippy-vel kombinálva:
fn describe(x: Option<i32>) -> String {
let Some(v) = x else {
return String::from("nincs érték");
};
format!("érték: {}", v)
}
Mit jelent ez a napi Rust-fejlesztésben?
Ha valaki csendes, „infrastrukturális” release-nek gondolná az 1.69-et, igaza van — de ne becsüljük alá! A build script-ek inkrementális fordítása és a cargo fix finomhangolása pontosan azok a dolgok, amik a nap 8 órájában, tucatszor lefutó cargo build és cargo check parancsok sebességét és megbízhatóságát javítják.
Ha nagyobb workspace-ben dolgozol, ahol több crate is generál kódot build time-ban (pl. gRPC service definíciók fordítása tonic-kal, vagy FFI binding-ek generálása bindgen-nel), az inkrementális build script fordítás közvetlenül a te fejlesztési ciklusaidat rövidíti. A cargo fix javulásai pedig különösen hasznosak lesznek, ha egy nagyobb legacy kódbázist próbálsz modernizálni, vagy csak rendszeresen karban tartod a warning-mentességet CI-ban.
A nyelv magja továbbra is stabil marad ezen a ponton — a GAT-ok (Generic Associated Types) és a let-else szintaxis már korábbi verziók óta elérhetők, és az 1.69 nem hoz melléjük újabb nagy nyelvi bővítést. Az edition is marad a megszokott 2021. Ez egy tipikus „karbantartó” release, ami a fejlesztői tooling-ot csiszolja, nem a nyelvet bővíti.
Ha CI pipeline-odban rögzített Rust-verziót használsz (pl. Docker image-ben pinnelt toolchain), ne feledd frissíteni azt is — a lokális rustup update önmagában nem érinti a build szervereket.
Hogyan frissíts?
Ha rustup-ot használsz (amit erősen javasolt mindenkinek, aki még nem tette), a frissítés egyetlen parancs:
rustup update stable
Ez letölti és beállítja az 1.69-et mint az alapértelmezett stabil toolchaint. Ellenőrizni a verziót a szokásos módon tudod:
rustc --version
# rustc 1.69.0 (84c898d65 2023-04-16)
Ha Linux disztribúciós package manager-ből (pl. apt, pacman) telepítetted a Rust-ot, érdemes megnézni, hogy a csomag már frissült-e — ezek gyakran néhány napos-hetes csúszással követik a hivatalos release-eket, tehát ha nálad még 1.68-at mutat a rustc --version, ne ess kétségbe, hamarosan érkezik.
Összefoglalás
A Rust 1.69 nem forradalmi kiadás, de pontosan azt a fajta fejlesztést hozza, amire minden aktív, nagy kódbázison dolgozó csapatnak szüksége van: gyorsabb build script fordítás és megbízhatóbb cargo fix. Ezek a láthatatlan, de nagyon is érzékelhető javítások azok, amik miatt a Rust ökoszisztéma évről évre kényelmesebb lesz a napi használatban. Ha még nem tetted, frissíts rustup update stable-lel, és élvezd a gyorsabb cargo build ciklusokat!