Pembaruan Pengembangan crates.io
(blog.rust-lang.org)- Selama 6 bulan terakhir, crates.io memperkenalkan penampil kode sumber untuk memeriksa langsung paket yang dipublikasikan serta sistem akun yang independen dari GitHub, dan memperkuat panduan keamanan serta pengganti pustaka standar
- Tab
Codebaru mendukung pencarian file, penyorotan sintaks, dan pemilihan baris yang dapat dibagikan; dengan manifes ZIP dan JSON dari CDN serta permintaan rentang HTTP, hanya file yang diperlukan yang dimuat tanpa membebani server API - Sesuai RFC #3946, implementasi nama pengguna khusus crates.io telah dimulai; setelah perubahan nama pengguna dan peninjauan keamanan, ke depannya akan mendukung penyedia autentikasi selain GitHub
- Frontend telah sepenuhnya dimigrasikan dari Ember.js ke Svelte, sementara pencarian, pencarian dependensi balik, caching CDN, dan pemrosesan indeks Git juga ditingkatkan untuk performa dan stabilitas
- Peringatan penghentian pemeliharaan dari RustSec dan API pengganti pustaka standar seperti
std::sync::LazyLockditampilkan di halaman paket untuk mendukung audit dependensi dan penghapusan dependensi yang tidak perlu
Penampil kode sumber untuk memeriksa paket yang dipublikasikan
- Di tab
Codebaru pada halaman paket, file dari setiap versi yang dipublikasikan dapat dijelajahi di dalam crates.io- Yang ditampilkan bukan repositori tertaut, melainkan file yang benar-benar diunduh saat
cargomenambahkan dependensi - File yang tidak ada di repositori, seperti
Cargo.tomlternormalisasi yang dibuat olehcargo, juga dapat diperiksa sehingga audit dependensi menjadi lebih mudah
- Yang ditampilkan bukan repositori tertaut, melainkan file yang benar-benar diunduh saat
- Penampil mendukung pencarian pohon file, penyorotan sintaks, dan pemilihan baris ala GitHub
- Dengan mengklik atau menyeret nomor baris, URL yang dapat dibagikan dalam bentuk
#L10-L20akan dibuat
- Dengan mengklik atau menyeret nomor baris, URL yang dapat dibagikan dalam bentuk
- Server membuat file ZIP dan manifes JSON yang mendeskripsikan struktur file untuk semua versi yang dipublikasikan
- Karena file
.crateyang digunakancargoadalah tarball terkompresi gzip yang tidak mendukung akses acak, file tersebut dikemas ulang oleh pekerjaan latar belakang menjadi ZIP yang dapat dijelajahi - ZIP dan manifes disediakan melalui CDN statis
- Frontend mengambil manifes terlebih dahulu, lalu memuat setiap file hanya saat dibutuhkan menggunakan permintaan rentang HTTP
- Penjelajahan sumber secara praktis tidak menambah beban pada server API crates.io, dan versi lama juga diproses secara massal sehingga rilis lama pun didukung
- Karena file
- Pustaka rendering untuk penampil kode pada awalnya adalah perender diff, dan penampil perbandingan antarversi yang memanfaatkan infrastruktur yang sama juga sedang dikembangkan
- Setelah selesai, perubahan persis antara dua versi yang dipublikasikan dapat ditinjau di crates.io
Akun crates.io yang independen dari GitHub
- Tim crates.io menyetujui RFC #3946 pada akhir Mei
- Sebelumnya, login GitHub dan identitas crates.io sangat terikat, sehingga nama pengguna juga ditentukan oleh akun GitHub; RFC ini memperkenalkan nama pengguna khusus crates.io yang independen dari akun tertaut
- Nama pengguna khusus ini adalah prasyarat untuk mendukung login melalui penyedia autentikasi selain GitHub di masa mendatang
- Implementasi sudah dimulai, tetapi fitur utama yang masih belum selesai dan akan terlihat oleh pengguna adalah perubahan nama pengguna
- Setelah itu selesai, RFC tambahan dan implementasi terkait login penyedia autentikasi lain akan dilanjutkan
- Karena berdampak langsung pada autentikasi dan keamanan akun, peluncuran dilakukan perlahan dalam tahap-tahap kecil yang ditinjau dengan hati-hati
Imbauan keamanan dan panduan pengganti pustaka standar
- Tab
Securityyang sudah ada menampilkan imbauan keamanan dari basis data RustSec, dan kini paket yang ditandai RustSec sebagai tidak lagi dipelihara juga menampilkan banner peringatan di bagian atas halaman- Dari banner tersebut, pengguna dapat membuka imbauan terkait yang berisi detail dan alternatif yang memungkinkan
- Pada paket yang fungsinya telah diserap ke pustaka standar, banner “You might not need this dependency” ditampilkan
- Misalnya,
lazy_staticdapat diganti denganstd::sync::LazyLockmulai Rust 1.80 - Di daftar dependensi, paket yang telah digantikan diberi ikon bohlam kecil yang memberikan panduan yang sama
- Misalnya,
- Data terkait dikelola di repositori baru rust-lang/std-replacement-data
- Hanya entri pengganti pustaka standar yang diizinkan
- Setiap entri harus mengutip API
std,core, atauallocyang telah stabil serta versi Rust terkait - Sebelum menambahkan entri, pengelola paket diberi tahu dan diberikan periode untuk menyampaikan pendapat
- Entri baru dapat diusulkan ke repositori, dan data yang terkumpul juga dapat dimanfaatkan oleh alat lain
Migrasi frontend Svelte selesai
- Eksperimen memindahkan frontend crates.io dari Ember.js ke Svelte telah berhasil diselesaikan
- Frontend baru telah mencapai tingkat yang setara dengan fitur lama
- Setelah pengujian publik pada April, frontend ini dijadikan frontend default pada awal Mei
- Aplikasi Ember.js telah dihapus dari repositori
- Karena ini adalah migrasi satu-ke-satu yang memindahkan desain dan fitur lama apa adanya, perubahan dirancang agar tidak terasa oleh pengguna
- Tim dan kontributor kini dapat menggunakan framework modern sekaligus menurunkan hambatan masuk bagi kontributor baru dan mempercepat iterasi pengembangan; penampil kode sumber adalah salah satu contohnya
- Ucapan terima kasih disampaikan kepada tim Ember.js yang digunakan crates.io selama bertahun-tahun dan tim Svelte yang mendukung transisi ini
Halaman galat Ferris
- Ferris di halaman galat crates.io kini mengikuti kursor mouse dengan matanya
- Halaman galat 404 juga menyediakan interaksi kecil
Performa pencarian dan pencarian dependensi balik
- Sebelumnya, pencarian berdasarkan relevansi menghitung peringkat semua paket yang cocok dengan kata kunci, sehingga untuk kata kunci pendek atau umum bisa memakan waktu 1–2 detik
- Kini cakupan perhitungan peringkat dibatasi ke 1.000 paket cocok dengan jumlah unduhan terbaru terbanyak
- Endpoint dependensi balik tidak lagi menghitung ulang seluruh kumpulan paket dependen pada setiap permintaan
- Hasil disediakan dari tabel prakomputasi yang disinkronkan oleh trigger basis data
- Join yang mahal diganti dengan pemindaian indeks terbatas, sehingga kemungkinan timeout turun drastis
Dokumentasi arsitektur dan rendering Markdown
ARCHITECTURE.mddirombak menyeluruh dengan fokus pada sistem tingkat tinggi crates.io dan cara sistem-sistem tersebut saling terhubung- Proses yang terjadi saat menjalankan
cargo publish - Alasan unduhan paket biasa tidak melewati server API
- Cara jumlah unduhan dihitung dari log akses CDN
- Proses yang terjadi saat menjalankan
- README kini merender daftar definisi, sebuah ekstensi Markdown yang banyak digunakan
- Perender Markdown comrak sebenarnya sudah mendukung daftar definisi, tetapi ekstensi tersebut belum diaktifkan
Peningkatan efisiensi cache CDN
- Metadata tag cache ditambahkan ke file yang diunggah ke CDN statis
- Alih-alih mengirim permintaan invalidasi terpisah untuk setiap URL file, semua file cache dari paket atau rilis tertentu dapat diinvalidasi sekaligus
- Header respons global
Vary: Cookieyang menghambat caching CDN untuk respons API publik dan aset frontend telah dihapus- Untuk respons khusus pengguna,
Cache-Control: no-storediterapkan sebagai gantinya - Hasilnya, rasio cache hit di edge CDN meningkat
- Untuk respons khusus pengguna,
Aksesibilitas dan pemrosesan indeks Git
- Aksesibilitas crates.io ditingkatkan untuk pengguna pembaca layar
- Ikon dekoratif disembunyikan dari pohon aksesibilitas
- Hierarki judul diperbaiki
- Markup daftar yang benar diterapkan pada daftar
- Pengujian snapshot ARIA diperkenalkan untuk mencegah regresi masuk tanpa terdeteksi
- Aksesibilitas akan terus ditingkatkan selama beberapa bulan ke depan
- Salinan lokal indeks Git milik worker latar belakang diubah menjadi repositori bare dan shallow
- Sekitar 250 ribu file checkout dan seluruh riwayat commit dihapus dari disk
- Ini meningkatkan performa pemrosesan di tengah meningkatnya frekuensi publikasi paket
- Squash indeks berkala kini menggunakan GitHub API, bukan membuat Git pack besar secara lokal
- Metode pembuatan pack lokal sebelumnya pernah menyebabkan worker produksi kehabisan memori
Kanal umpan balik
- Masukan dan pertanyaan terkait crates.io dapat disampaikan melalui Zulip atau GitHub Discussions
1 komentar
Komentar di Lobste.rs
Senang melihat pekerjaan untuk memisahkan akun crates.io dari GitHub sedang berjalan
Untuk login dengan email domain sendiri
example@example.com, letakkan file JSON dihttps://example.com/.well-known/webfingerdengansubjectbernilaiacct:example@example.comdanhrefpenerbit OpenID Connect bernilaihttps://codeberg.orgDi pengaturan Codeberg, buat aplikasi OAuth2 dengan URI pengalihan
https://login.tailscale.com/a/oauth_response, lalu masukkanClient IDdanClient Secretyang diterbitkan ke Tailscale. Sepertinya ke depan crates.io juga akan menyediakan cara serupaSaya tidak menyadari bahwa peningkatan crates.io belakangan ini sebesar ini. Biasanya saya mencari di lib.rs terlebih dahulu, tetapi mungkin kebiasaan itu akan segera berubah; perubahan yang paling saya sukai adalah Ferris
Perubahan mata Ferris secara fisika kurang masuk akal. Bagian putih pada mata hitam adalah highlight pantulan spekular, dan jika kursor mouse adalah sumber cahaya, itu pun sulit disebut sebagai ekspresi mata yang mengikuti kursor
Saat mengaudit dependensi, pertama-tama saya membuat symlink dari
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ke~/cargosrcagar mudah mengakses file yang diunduh CargoUntuk setiap dependensi yang akan diaudit, saya mengkloning repositori Git, melakukan checkout versi target, menghapus file yang sedang dilacak secara lokal, lalu mengirim
SIGSTOPke proses rust-analyzer. Saya menambahkan dependensi keCargo.tomlproyek, menjalankancargo fetch, kemudian menyalin isi direktori$dependency-$versionyang diunduh ke repositori hasil kloning, melakukan commit, dan meninjau perbedaannya dengan penampil riwayat GitSetelah peninjauan selesai, saya menyimpan kombinasi dependensi, versi, dan hash di
Cargo.lockke basis data tepercaya dengan skrip agar versi yang sama tidak perlu diperiksa lagi. Meski prosedurnya tampak rumit, sebagian besar sudah saya otomatisasi sehingga lebih efisien daripada UI web; saya berharap Cargo mendukung prosedur peninjauan seperti ini dari baris perintah. Saya juga penasaran apakah ada plugin yang membantu proses peninjauan itu sendiri, bukan alat seperti cargo-crevImplementasi ketika frontend hanya mengambil manifes lalu memuat tiap file saat diperlukan lewat permintaan rentang HTTP ada di sini, dan menggunakan
DecompressionStreambawaan browser