Rust 1.100.0 Rilis: Never Type Akhirnya Stabil, Cargo Bisa Tunda Update Dependensi
  easystem   14 November 2026   Developer

Tim Rust merilis versi 1.100.0 pada 12 November 2026, dan nomor bulat itu punya arti nyata: rilis ini membawa salah satu perubahan bahasa yang paling lama ditunggu, yaitu tipe never yang akhirnya stabil setelah sepuluh tahun dan lima kali gagal distabilkan. Ada pula serangkaian perbaikan Cargo yang langsung terasa di pekerjaan harian, mulai dari peringatan dependensi tak terpakai sampai kemampuan menunda pengambilan versi paket baru demi keamanan rantai pasok.

Bagi tim yang memakai Rust untuk layanan backend berperforma tinggi, CLI, atau komponen WebAssembly, versi ini layak masuk jadwal upgrade. Berikut isi pentingnya beserta cara memakainya.

Cara memperbarui

Jika sudah memakai rustup, satu perintah sudah cukup:

$ rustup update stable

Untuk proyek yang butuh hasil build reproduksibel, kunci versi lewat rust-toolchain.toml supaya seluruh anggota tim dan pipeline CI memakai toolchain yang sama.

Tipe never akhirnya stabil

Tipe never mewakili komputasi yang tidak pernah menghasilkan nilai, misalnya return, break, atau panic. Di dalam kode, tipe ini ditulis dengan tanda seru. Karena nilai bertipe itu mustahil ada, Rust mengizinkan konversinya ke tipe apa pun, sehingga satu cabang match boleh berhenti tanpa mengembalikan nilai:

fn ambil(option: Option<u32>) -> u32 {
    let value = match option {
        Some(x) => x,
        None => return 0,   // `return` bertipe never
    };
    value
}

Yang baru, tipe tersebut kini boleh ditulis di posisi tipe mana pun, termasuk sebagai parameter generik pada Result. Selain itu Infallible sekarang menjadi alias tipe never, jadi API lama yang memakainya otomatis kompatibel.

Ada satu breaking change yang perlu diperhatikan. Never type fallback berubah dari () menjadi tipe never juga pada edition 2015, 2018, dan 2021, sedangkan edition 2024 memang sudah memakai perilaku itu. Dampaknya jarang muncul, tetapi bisa menambah peringatan unreachable code atau mengubah inferensi pada kode yang mengabaikan hasil fungsi bergenerik. Sebelum upgrade, perbarui dulu dependensi karena perbaikan untuk crate terdampak sudah banyak dirilis.

DropGuard untuk rollback otomatis

Fitur baru yang paling praktis untuk kode aplikasi adalah core::mem::DropGuard. Tipe ini menjalankan sebuah closure saat nilainya di-drop, entah karena return, tanda ?, atau panic. Variabel di dalamnya tetap bisa dipakai normal lewat Deref dan DerefMut.

use std::mem::DropGuard;

fn parse_all(nums: &mut Vec<u32>, strings: &[&str]) -> Result<(), std::num::ParseIntError> {
    let len = nums.len();
    let mut nums = DropGuard::new(nums, move |nums| {
        nums.truncate(len);          // rollback bila ada yang gagal
    });

    for s in strings {
        nums.push(s.parse()?);       // error di sini memicu rollback
    }

    DropGuard::dismiss(nums);        // sukses, guard dibatalkan
    Ok(())
}

Pola ini menghapus kebutuhan menulis blok pembersihan manual berulang, dan cocok untuk operasi mirip transaksi: kumpulkan perubahan lebih dulu, lalu batalkan seluruhnya begitu satu langkah gagal.

Allocator API dan conjure_zst

Bagian inti allocator_api kini stabil. Trait Allocator memungkinkan penulis library mendefinisikan alokator kustom yang dipakai bersama Vec dan Box, lewat konstruktor seperti Vec::new_in dan Box::new_in. Ini fondasi proyek Allocators 1.0, dan dukungan untuk koleksi lain akan menyusul.

Ada juga std::mem::conjure_zst, fungsi unsafe khusus untuk membentuk nilai berukuran nol tanpa trik transmute(()) atau MaybeUninit::uninit().assume_init(). Banyak API memakai ketidakmampuan membentuk tipe semacam itu sebagai jaminan keamanan, contohnya token GIL di PyO3, sehingga fungsi ini tetap ditandai unsafe.

Cargo kini melaporkan dependensi tak terpakai

Dependensi yang tidak lagi dipakai memperlambat build, dan selama ini hanya lint rustc yang bisa mendeteksinya dengan risiko salah tuduh pada proyek multi-target. Cargo sekarang melaporkannya sendiri:

warning: unused dependency `tracing-subscriber`
  --> Cargo.toml:23:1
   |
23 | tracing-subscriber.workspace = true
   | ^^^^^^^^^^^^^^^^^^
   = note: `cargo::unused_dependencies` is set to `warn` by default

Peringatan ini bagian dari sistem lint baru Cargo yang diatur lewat tabel [lints.cargo] di Cargo.toml. Batasannya perlu dicatat: peringatan hanya muncul ketika semua target build yang mungkin memakai dependensi tersebut ikut dibangun, dan tidak berlaku untuk dev-dependencies.

min-publish-age: cooldown dependensi

Ini fitur keamanan yang paling relevan bagi pengelola proyek. Versi paket berbahaya biasanya ketahuan dalam hitungan jam sampai hari, dan Cargo 1.100 bisa menahan diri mengambil versi yang baru terbit sampai jendela waktu itu lewat:

[registry]
global-min-publish-age = "3 days"

Saat resolusi dependensi, Cargo melewati versi yang lebih muda dari batas tersebut lalu memberi tahu apa yang ditahan:

$ cargo update
    Locking 2 packages as of min-publish-age
    Adding cc (versi terbaru ditahan karena baru terbit 3 jam lalu)

Kalau versi terbaru memang dibutuhkan segera, override bisa dilakukan sekali jalan lewat variabel lingkungan CARGO_RESOLVER_INCOMPATIBLE_PUBLISH_AGE=allow pada perintah cargo update --precise. Tiga hal yang perlu diingat: fitur ini bergantung pada informasi waktu terbit (pubtime) dari registry sehingga versi tanpa data itu tidak akan ditahan, cargo install mengabaikan batas ini, dan cooldown bukan pertahanan total sehingga pembaruan dependensi tetap perlu ditinjau.

Perbaikan layout cache Cargo

Cargo kini konsisten menerapkan hash konfigurasi build pada seluruh isi build-dir, bukan hanya pada nama berkas. Efeknya, tidak ada lagi rebuild yang terlewat atau berlebih saat memakai kombinasi --features berbeda, dan build bersama antar git worktree jadi lebih dapat diandalkan. Perubahan ini bersifat internal, tetapi bisa memengaruhi skrip build yang selama ini memakai akal-akalan untuk menambal perilaku lama.

Langkah praktis untuk tim

  1. Perbarui toolchain di CI lebih dulu, jalankan seluruh test, baru naikkan versi di mesin pengembang.
  2. Kunci versi dengan rust-toolchain.toml agar hasil build konsisten antar mesin.
  3. Aktifkan global-min-publish-age = "3 days", atau tujuh hari untuk proyek yang sensitif, di .cargo/config.toml repositori.
  4. Jalankan cargo check --all-targets untuk melihat peringatan dependensi tak terpakai, lalu bersihkan Cargo.toml.
  5. Ganti pola rollback manual dengan DropGuard pada fungsi yang memutasi state secara bertahap.

Sumber: Announcing Rust 1.100.0 (Rust Blog), Cargo Configuration Reference: min-publish-age, Rust Release Notes.

Tags :

rust , cargo , keamanan-dependensi , open-source

Bagikan :