A crates.io 2023 elején több szempontból is mérföldkőhöz érkezett. A regisztrált crate-ek száma átlépte a 100 ezret, a heti letöltésszám pedig new rekordot döntött – ez jól mutatja, hogy a Rust ökoszisztéma továbbra is exponenciálisan növekszik. Nézzük végig a legfontosabb híreket.

Rekordok és népszerű crate-ek a negyedévben

Az elmúlt hetekben a serde, a tokio és a syn crate-ek vitték a prímet a letöltési statisztikákban – ez nem meglepő, hiszen ezek a de facto alapkövei szinte minden komolyabb Rust projektnek. Érdekesség, hogy a webes keretrendszerek közül az axum (jelenleg 0.6-os fő verzióban) is jelentős növekedést mutatott, ahogy egyre több csapat vált át rá a tokio ökoszisztémán belül.

// Egy tipikus axum 0.6-os handler, ami jól mutatja,
// miért lett ilyen népszerű a crate az elmúlt hónapokban
use axum::{routing::get, Router, response::IntoResponse};

async fn health_check() -> impl IntoResponse {
    "OK"
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/health", get(health_check));

    axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
        .serve(app.into_make_service())
        .await
        .unwrap();
}
Megjegyzés

Ha még nem próbáltad az axum-ot, most van itt az ideje – a 0.6-os verzió stabil API-t kínál, és jól illeszkedik a tokio 1.x ökoszisztémájához.

A játékfejlesztés terén a bevy (0.9-es verzió) is szép növekedést produkált – egyre több hobbifejlesztő és kisebb stúdió választja ECS-alapú megközelítése miatt. A crates.io csapata külön blogbejegyzésben emelte ki, hogy a game dev kategória az egyik leggyorsabban bővülő szegmens.

Frissített crate-elnevezési és tulajdonjogi szabályok

A legnagyobb port az elnevezési irányelvek frissítése kavarta. A crates.io csapata már hosszabb ideje küzd az úgynevezett "name squatting" jelenséggel, amikor valaki csak azért regisztrál egy népszerű vagy potenciálisan népszerűvé váló nevet, hogy aztán eladja, vagy egyszerűen csak "lefoglalja" azt anélkül, hogy bármilyen tartalmat töltene fel hozzá.

Az új szabályozás szerint:

  • Ha egy crate 12 hónapig nem kap frissítést, és a leírása/dokumentációja gyakorlatilag üres, a fenntartó megkeresést kap a szándékáról.
  • Válasz hiányában a csapat fenntartja a jogot, hogy a nevet "felszabadítsa", amennyiben egy másik fejlesztő igazolni tudja, hogy aktívan fejlesztene rá épülő projektet.
  • A tulajdonjog-átruházás folyamata is átláthatóbbá vált: mostantól a cargo owner parancshoz kapcsolódó meghívásokat naplózza a rendszer, és értesítést küld minden érintett félnek.
// A tulajdonjog kezelése természetesen a parancssorból történik,
// nem Rust kódból, de érdemes tudni, hogy a folyamat auditálható:
// $ cargo owner --add valaki_github_neve
// $ cargo owner --list
fn main() {
    println!("A tulajdonjog-kezelés a cargo CLI-n keresztül történik.");
}
Jó tudni

Ha van olyan crate-ed, amit régen nem frissítettél, érdemes most egy rövid README-frissítést vagy legalább egy CHANGELOG bejegyzést tenni, hogy egyértelmű legyen: a projekt még "él".

Biztonsági fejlesztések a csomagregiszter körül

A biztonság kérdése továbbra is kiemelt prioritás. Az elmúlt hónapokban a crates.io csapata több lépést is tett:

  1. Kétfaktoros hitelesítés (2FA) erősítése: bár a 2FA korábban is elérhető volt, mostantól bizonyos műveletekhez (pl. új tulajdonos hozzáadása, tömeges publikálás) kötelezővé vált.
  2. Automatikus malware-szkennelés: a feltöltött crate-ek forráskódját és build scriptjeit (build.rs) egyszerű heurisztikák alapján átvizsgálják gyanús minták (pl. hálózati hívások telepítés közben) után kutatva.
  3. Yanked verziók kezelésének finomítása: a cargo yank parancs által visszavont verziók mostantól explicit figyelmeztetést adnak build közben, nem csak a cargo update során.
// Egy build.rs script, ami pont az a fajta minta, amit
// a crates.io csapata most már automatikusan vizsgál
fn main() {
    // Ez rendben van: build-time konstansok generálása
    println!("cargo:rustc-env=BUILD_TIME={}", chrono_like_timestamp());
}

fn chrono_like_timestamp() -> String {
    // Csak illusztráció, valós projektben inkább
    // egy dedikált crate-et használnánk erre
    String::from("2023-03-08")
}
Figyelem

Ha a build.rs scripted hálózati kapcsolatot nyit vagy külső bináriust tölt le, számíts rá, hogy ez mostantól nagyobb eséllyel akad fenn az automatikus vizsgálaton – érdemes ezt dokumentálni a README-ben, hogy elkerüld a felesleges megkereséseket.

Hogyan reagál a közösség a változásokra

A közösség reakciói vegyesek, de összességében pozitívak. A Rust fórumokon és a Reddit r/rust szubredditjén a legtöbb hozzászóló üdvözölte a name squatting elleni fellépést – sokan hosszú ideje panaszkodtak arra, hogy bizonyos hasznos nevek évek óta üresen "lógnak" a regiszterben.

Ugyanakkor néhányan aggodalmukat fejezték ki a folyamat esetleges félreértelmezése miatt: mi van, ha valaki csak ritkán, de aktívan karbantart egy stabil, "kész" crate-et, ami éppen ezért nem kap gyakori commitokat? A crates.io csapata erre reagálva pontosította, hogy a döntéshozatal során figyelembe veszik a letöltési statisztikákat és a nyitott issue-kra adott válaszokat is, nem csak a commit gyakoriságot.

A biztonsági intézkedésekkel kapcsolatban is volt kritika – néhány fenntartó szerint a kötelező 2FA bizonyos workflow-kat (pl. CI/CD-ből történő automatikus publikálást) megnehezít. Erre válaszul a csapat API-token alapú megoldást javasol, ami kompatibilis marad a 2FA-val, miközben az automatizált folyamatok is zökkenőmentesen működhetnek.

Mit érdemes tudni crate-fenntartóként

Ha te is fenntartasz egy vagy több crate-et, íme néhány konkrét teendő, amit érdemes már most átgondolni:

  • Frissítsd a Cargo.toml metaadatait. A categories és keywords mezők kitöltése nemcsak a felfedezhetőséget javítja, hanem azt is jelzi, hogy a projekt aktívan gondozott.
[package]
name = "pelda-crate"
version = "0.3.1"
edition = "2021"
description = "Egy példa crate, ami jól dokumentált metaadatokkal rendelkezik"
license = "MIT OR Apache-2.0"
repository = "https://github.com/pelda/pelda-crate"
categories = ["data-structures", "algorithms"]
keywords = ["example", "demo"]
  • Kapcsold be a 2FA-t, ha még nem tetted. Egyre több szervezet és nagyobb projekt várja el ezt együttműködési feltételként.
  • Dokumentáld a build.rs viselkedését, ha van ilyen scripted a crate-edben – ez segít elkerülni a felesleges automatikus figyelmeztetéseket.
  • Ne hagyd válasz nélkül a crates.io megkereséseit. Ha kapsz egy e-mailt az inaktivitásról, egy rövid válasz is elég ahhoz, hogy a nevedet ne veszítsd el.
  • Használd ki a stabil nyelvi feature-öket a kódod olvashatóságáért. Például a let-else szintaxis remekül helyettesíti a felesleges match blokkokat egyszerű early-return esetekben:
fn feldolgoz(input: Option<i32>) -> i32 {
    let Some(ertek) = input else {
        return 0;
    };
    ertek * 2
}
Tipp

A generic associated types (GATs) is stabil már, így ha eddig kerülted őket bonyolultságuk miatt, most jó alkalom lehet megnézni, hol egyszerűsíthetnék a saját trait-definícióidat.

Összefoglalás

A 2023 első negyedéve komoly előrelépéseket hozott a crates.io körül: a letöltési rekordok azt mutatják, hogy a Rust ökoszisztéma egészséges tempóban növekszik, miközben a csapat proaktívan lép fel a régóta fennálló problémák – mint a name squatting és a biztonsági rések – ellen. Fenntartóként érdemes naprakészen tartani a metaadatokat, komolyan venni a biztonsági ajánlásokat, és időben reagálni a regiszter megkereséseire. A közösség összességében támogatja az irányt, még ha egyes részletek finomhangolása még folyamatban is van.