Mi ez a release és mikor jelent meg

A Rust csapata a megszokott hat hetes ciklusban dolgozik, és ennek eredményeként 2023. november 16-án megjelent a Rust 1.74 stabil verziója. Ha ma frissítesz, ez lesz az, amit megkapsz. Nem egy feature-dús kiadás, mint amilyen néhány korábbi volt a GATs vagy a let-else bevezetésével, de két apró, praktikus fejlesztés van benne, amit nagyon sok fejlesztő fog kedvelni – főleg azok, akik közepes-nagy méretű workspace-eken dolgoznak.

Megjegyzés

A Rust release ciklusa kiszámítható: minden hat hétben új stable verzió jön ki. A 1.74 pontosan ezt a ritmust követi az 1.73 után.

Újdonság: lint-konfiguráció közvetlenül a Cargo.toml-ban

Eddig, ha egy projektben egységesen akartunk lint-szabályokat érvényesíteni – mondjuk #![warn(missing_docs)] vagy #![deny(unsafe_code)] –, azt vagy a lib.rs/main.rs tetején, attribútumként kellett beírni, vagy egy .cargo/config.toml-ba bújtatott environment változóval trükközni. Mostantól van egy natív, deklaratív megoldás: a Cargo.toml-ban egy [lints] táblát definiálhatunk.

[package]
name = "pelda-projekt"
version = "0.1.0"
edition = "2021"

[lints.rust]
unsafe_code = "forbid"
missing_docs = "warn"

[lints.clippy]
all = "warn"
pedantic = "warn"

Ez a megoldás azért jó, mert:

  • Verziókövetett, tehát a git history-ban is látszik, ha valaki lazít vagy szigorít egy szabályon.
  • Workspace-szinten örökölhető – egy közös [workspace.lints] táblát definiálhatsz a root Cargo.toml-ban, és a tagcrate-ek egyszerűen lints.workspace = true-val hivatkozhatnak rá.
  • Nem kell attribútumokat szórni minden lib.rs és main.rs tetejére.

Így néz ki a workspace-örökítés gyakorlatban:

# workspace root Cargo.toml
[workspace.lints.clippy]
all = "warn"

# tagcrate Cargo.toml
[lints]
workspace = true
Tipp

Ha eddig #![deny(...)] attribútumokkal dolgoztál a kódban, most jó alkalom lehet átmozgatni ezeket a Cargo.toml-ba – tisztább, és a CI pipeline-ban is jobban látható lesz, ha valaki módosít rajta.

Újdonság: cargo build --keep-going

A másik nagy nyereség a cargo build --keep-going flag. Eddig, ha egy workspace-ben tíz crate volt, és a harmadik fordítási hibába futott, a Cargo azonnal megállt, és a maradék hét crate-ről semmit sem tudtál meg. Ez különösen fájó volt nagy monorepo-kban, ahol egy refaktor sok crate-et érint egyszerre.

cargo build --keep-going

Ezzel a flaggel a Cargo megpróbálja a lehető legtöbb crate-et lefordítani, és csak a végén, összesítve dobja ki az összes hibát. Ez a make -k-hoz hasonló viselkedés, amit sok build-rendszerben ismerhetsz.

// src/lib.rs egy workspace crate-ben
pub fn osszead(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tesztek {
    use super::*;

    #[test]
    fn osszead_teszt() {
        assert_eq!(osszead(2, 3), 5);
    }
}

Ha ebben a crate-ben van egy hiba, de a workspace másik öt crate-je rendben van, a --keep-going mellett mind az öt lefordul, és csak a hibás crate esetében kapsz jelzést a build végén.

Figyelem

A --keep-going nem helyettesíti a CI-ban a normál build-et – csak fejlesztés közben hasznos, hogy gyorsabban lásd, mi minden működik még, miközben egy hibát javítasz.

Mit jelent ez a gyakorlatban a mindennapi Rust fejlesztőknek

Ezek nem monumentális nyelvi feature-ök, mint a GATs vagy a let-else volt, hanem inkább a developer experience finomhangolása. De pont ez a fajta apró csiszolás az, amitől a Rust tooling napról napra érik.

A lint-konfiguráció Cargo.toml-ba tétele különösen azoknak lesz hasznos, akik csapatban dolgoznak, és szeretnék egységesíteni a code style-t anélkül, hogy minden fájlba be kellene írni az attribútumokat. Ha eddig OnceCell-t vagy OnceLock-ot használtál lusta inicializáláshoz, vagy élveztél a let-else szintaxist a hibakezelésben, ez most egy hasonlóan praktikus, mindennapi életet megkönnyítő újítás.

use std::sync::OnceLock;

static KONFIG: OnceLock<String> = OnceLock::new();

fn get_konfig() -> &'static str {
    KONFIG.get_or_init(|| "alap-konfiguracio".to_string())
}

fn main() {
    println!("{}", get_konfig());
}

A --keep-going pedig azoknak segít, akik nagy workspace-eken iterálnak: nem kell minden hiba javítása után újra elindítani a build-et, hogy lássák, hol állnak a többi crate-tel.

Hogyan frissíts

Ha rustup-ot használsz (és remélhetőleg azt használsz), a frissítés egyetlen paranccsal megy:

rustup update stable

Ez letölti és beállítja az 1.74-et, mint az aktuális stable toolchaint. Ellenőrizni tudod a verziót:

rustc --version
# rustc 1.74.0 (79e9716c9 2023-11-13)
Jó tudni

A [lints] tábla és a --keep-going flag mindkettő Cargo-funkció, tehát ha nem csak rustc-t, hanem cargo-t is a rustup-on keresztül kezeled (ami a legtöbb esetben igaz), a rustup update mindkettőt naprakészre hozza.

Az edition marad 2021, tehát a projektjeidben nem kell semmit módosítani a Cargo.toml edition mezőjében – az új Cargo-funkciók a meglévő edition-nel is azonnal használhatók.

Összefoglalás

A Rust 1.74 nem forradalmi release, de két apró, praktikus fejlesztést hoz: a natív lint-konfigurációt a Cargo.toml-ban, és a --keep-going flaget, ami sokat segít nagy workspace-ek fejlesztésénél. Ha rustup-ot használsz, a frissítés egy paranccsal megy, és érdemes is megtenni, mert ezek a kis csiszolások összeadva jelentősen javítják a napi Rust-fejlesztői élményt. A következő release-ekben is minden bizonnyal hasonló, gyakorlatorientált finomítások jönnek majd – ez a Rust fejlesztési filozófiájának egyik erőssége.