Miért hagyta el a közösség a tui-rs projektet
Ha az elmúlt években Rustban írtál terminálos felhasználói felületet — legyen az egy htop-szerű monitorozó eszköz, egy git klienst helyettesítő TUI, vagy csak egy hobbiprojekt —, valószínűleg a tui-rs crate-et használtad. Florian Dehau eredeti könyvtára gyakorlatilag egyeduralkodó volt a terén, és rengeteg ismert projekt (pl. a spotify-tui vagy a gitui) épült rá.
A probléma az volt, hogy a fenntartó fokozatosan elfordult a projekttől. Nyitott PR-ek hónapokig vártak review-ra, a widget-eket érintő bugfixek nem kerültek be, és az issue tracker egyre inkább egy temetővé vált. A közösség több alkalommal próbált kapcsolatba lépni a maintainerrel, de a válaszok elmaradtak vagy csak sporadikusan érkeztek. Ez sok, a tui-rs-re épülő projekt fejlesztőjét arra kényszerítette, hogy saját forkokban javítsák ki a hibákat, ami hosszú távon szétforgácsolta az ökoszisztémát.
Ez nem egyedi eset a Rust-világban — hasonló mintát láthattunk már más, korábban aktív crate-eknél is. A lényeg mindig az, hogy a közösség időben reagáljon, mielőtt a projekt teljesen megáll.
2023 elején egy maroknyi aktív kontribútor úgy döntött, hogy nem várnak tovább, és létrehozták a ratatui szervezetet a GitHubon, amely a tui-rs kódbázisát vette át kiindulási pontnak.
A ratatui fork célja és filozófiája
A ratatui csapata világosan kommunikálta a szándékait: nem cél az API teljes újraírása vagy egy versengő, inkompatibilis könyvtár létrehozása, hanem egy aktívan karbantartott, közösség által irányított folytatás. A projekt maintainer csapata több emberből áll, ami azt jelenti, hogy egyetlen személy hiánya vagy elfoglaltsága nem bénítja meg a fejlesztést.
A filozófia három pillérre épül:
- Gyors release ciklus — a felmerülő bugfixek és kisebb API-javítások ne álljanak hónapokig a review sorban.
- Visszafelé kompatibilitás, ahol csak lehetséges — a migrálás a
tui-rs-ről minimális erőfeszítéssel járjon. - Nyílt döntéshozás — az API-t érintő nagyobb változásokról GitHub Discussions-ben és RFC-szerű issue-kban vitatkoznak, mielőtt bekerülnek a kódba.
Ha eddig a tui-rs-t használtad, most van a legjobb pillanat átállni — a ratatui csapata kifejezetten figyel arra, hogy a migráció ne fájjon.
Újdonságok a 0.21-es kiadásban
A 0.21-es release az első olyan kiadás, amely már teljesen a ratatui saját release-folyamatán készült, nem csak egy egyszerű újracsomagolása a régi kódnak. A legfontosabb változások:
- Felhalmozott bugfixek: több, a
tui-rs-ben évek óta nyitva álló issue került lezárásra, különösen aTableésListwidget-ek scroll-állapotát érintő hibák. - Backend absztrakció finomítása: a
Backendtrait implementációja crossterm és termion alatt egységesebb lett, kevesebb platformspecifikus meglepetéssel. - Dokumentáció bővítése: rendes
docs.rsdokumentáció, több példakód a repóban, és egy frissexamples/mappa, amely tényleg fordul és fut. - Kisebb API tisztítások: néhány deprecated metódus eltávolítva, illetve egyértelműbb naming a widget builder mintákban.
Íme egy minimális, 1.69-es Rust-tal fordítható alkalmazás a ratatui 0.21 és a crossterm backend használatával:
use std::io;
use crossterm::{
event::{self, Event, KeyCode},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use ratatui::{
backend::CrosstermBackend,
widgets::{Block, Borders},
Terminal,
};
fn main() -> io::Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
loop {
terminal.draw(|f| {
let size = f.size();
let block = Block::default()
.title("ratatui demo")
.borders(Borders::ALL);
f.render_widget(block, size);
})?;
if let Event::Key(key) = event::read()? {
if key.code == KeyCode::Char('q') {
break;
}
}
}
disable_raw_mode()?;
execute!(terminal.backend_mut(), LeaveAlternateScreen)?;
Ok(())
}
Az API tehát nagyon hasonló marad a tui-rs-hez, ami szándékos döntés — a fő cél a súrlódásmentes átállás.
Migráció tui-rs projektből ratatui-ra
A legtöbb projektnél a migráció tényleg csak egy find-and-replace szintű művelet. Első lépésként a Cargo.toml-ban ki kell cserélni a függőséget:
# Előtte
[dependencies]
tui = "0.19"
crossterm = "0.26"
# Utána
[dependencies]
ratatui = "0.21"
crossterm = "0.26"
Ezután a kódban minden use tui::... importot át kell írni use ratatui::...-ra. A widget-ek, layout-ok és a Terminal típus neve és viselkedése változatlan maradt, így a fordító a legtöbb esetben csak a hiányzó importokra fog panaszkodni, nem pedig típushibákra.
Érdemes kihasználni az alkalmat, és a migráció közben modernizálni a kódot is. Például a ListState kezelésénél remekül jön a Rust 1.65 óta stabil let-else szintaxis, ami olvashatóbbá teszi az early-return mintákat:
// Rust 1.69-kompatibilis let-else használat állapot-kiolvasáshoz
fn selected_index(state: &ratatui::widgets::ListState) -> usize {
let Some(index) = state.selected() else {
return 0;
};
index
}
Ha a projekted termion backendet használt, mielőtt élesben migrálnál, futtasd le a teljes teszt-suite-ot — a ratatui csapata elsősorban a crossterm backendre koncentrált a 0.21-es kiadásnál, a termion-oldali finomhangolás inkább a következő verziókban várható.
A crate neve ratatui, de a repóban és a dokumentációban helyenként még találkozhatsz tui-rs-re mutató régi linkekkel — mindig a hivatalos ratatui-org GitHub szervezetet és a docs.rs/ratatui dokumentációt vedd alapul.
A terminal UI ökoszisztéma jövője Rustban
A fork sikere nem csak a ratatui saját fejlődésén mérhető, hanem azon is, hogy a rá épülő magasabb szintű könyvtárak — mint a tui-textarea szövegszerkesztő widget vagy a tui-realm komponens-alapú keretrendszer — hogyan reagálnak. Az első jelek kedvezőek: több ilyen projekt már bejelentette, hogy a következő kiadásában áttér a ratatui-ra mint alap függőségre.
Hosszabb távon ez a lépés minden bizonnyal megerősíti a Rust TUI-ökoszisztémáját. Egy aktívan karbantartott, közösségi döntéshozású alapkönyvtár azt jelenti, hogy a rá épülő eszközök is stabilabb talajon állhatnak. A CLI és TUI eszközök piaca Rustban egyébként is növekszik — gondoljunk csak a gitui, a bottom vagy a különféle system monitor és fájlkezelő terminál-alkalmazásokra —, így egy megbízható widget-könyvtár léte kulcsfontosságú.
Összefoglalás
A ratatui 0.21 nem egy forradalmi új API-t hoz, hanem valami sokkal fontosabbat: egy aktívan karbantartott, közösség által irányított jövőt a tui-rs kódbázisának. Ha van egy porladó terminál-alkalmazásod, ami még mindig a régi tui crate-et importálja, most van itt az ideje az átállásnak — a migráció költsége minimális, a haszon viszont hosszú távú.