crates.io geliştirme güncellemesi
(blog.rust-lang.org)- Son 6 ayda crates.io, yayımlanan paketleri doğrudan incelemeye yarayan bir kaynak kod görüntüleyici ve GitHub’dan bağımsız bir hesap sistemi getirdi; güvenlik ve standart kitaplık alternatifleriyle ilgili yönlendirmeleri güçlendirdi
- Yeni
Codesekmesi dosya arama, sözdizimi vurgulama ve paylaşılabilir satır seçimini destekliyor; CDN’deki ZIP ve JSON manifestleri ile HTTP aralık istekleri sayesinde API sunucusuna yük bindirmeden yalnızca gerekli dosyaları getiriyor - RFC #3946 doğrultusunda crates.io’ya özgü kullanıcı adları uygulanmaya başlandı; kullanıcı adı değiştirme ve güvenlik incelemesinin ardından gelecekte GitHub dışındaki kimlik doğrulama sağlayıcılarının desteklenmesi planlanıyor
- Ön yüz tamamen Ember.js’ten Svelte’e taşındı; arama, ters bağımlılık sorgulama, CDN önbellekleme ve Git indeks işleme de performans ve kararlılığı artıracak şekilde iyileştirildi
- RustSec’in bakım durdurma uyarıları ve
std::sync::LazyLockgibi standart kitaplıkta yer alan alternatif API’ler paket sayfalarında gösterilerek bağımlılık denetimleri ve gereksiz bağımlılıkların kaldırılması destekleniyor
Yayımlanmış paketleri incelemek için kaynak kod görüntüleyici
- Paket sayfasındaki yeni
Codesekmesi üzerinden yayımlanmış her sürümün dosyaları crates.io içinde gezilebiliyor- Bağlı depoyu değil,
cargobir bağımlılık eklediğinde gerçekten indirdiği dosyaları gösteriyor cargotarafından oluşturulan normalleştirilmişCargo.tomlgibi depoda bulunmayan dosyalar da görülebildiği için bağımlılık denetimi kolaylaşıyor
- Bağlı depoyu değil,
- Görüntüleyici dosya ağacında arama, sözdizimi vurgulama ve GitHub tarzı satır seçimini destekliyor
- Satır numarasına tıklandığında veya sürüklendiğinde
#L10-L20biçiminde paylaşılabilir bir URL oluşturuluyor
- Satır numarasına tıklandığında veya sürüklendiğinde
- Sunucu, yayımlanmış tüm sürümler için ZIP dosyaları ve dosya yapısını açıklayan bir JSON manifesti oluşturuyor
cargonun kullandığı.cratedosyası rastgele erişimi desteklemeyen gzip sıkıştırmalı bir tarball olduğundan, arka plan işinde gezilebilir bir ZIP olarak yeniden paketleniyor- ZIP ve manifest statik CDN üzerinden sunuluyor
- Ön yüz önce manifesti alıyor, ardından her dosyayı yalnızca gerektiğinde HTTP aralık istekleriyle getiriyor
- Kaynak kod gezintisi crates.io API sunucusuna pratikte ek yük getirmiyor; mevcut sürümler de toplu işlenerek eski sürümlere kadar destek sağlanıyor
- Kod görüntüleyicinin render kitaplığı aslında bir fark render’ı; aynı altyapıyı kullanan sürümler arası karşılaştırma görüntüleyicisi de geliştiriliyor
- Tamamlandığında crates.io’da iki yayımlanmış sürüm arasındaki kesin değişiklikler incelenebilecek
GitHub’dan bağımsızlaşan crates.io hesapları
- crates.io ekibi mayıs sonunda RFC #3946’yı onayladı
- Önceden GitHub girişi ile crates.io kimliği sıkı biçimde bağlantılıydı ve kullanıcı adı da GitHub hesabına göre belirleniyordu; RFC ise bağlı hesaptan bağımsız crates.io’ya özgü kullanıcı adları getiriyor
- Bu özgün kullanıcı adı, gelecekte GitHub dışındaki kimlik doğrulama sağlayıcıları üzerinden giriş desteği için bir ön koşul
- Uygulama başlamış olsa da kullanıcıya görünen başlıca eksik özellik olarak kullanıcı adı değiştirme kalıyor
- Bu tamamlandıktan sonra diğer kimlik doğrulama sağlayıcılarıyla girişe ilişkin ek RFC ve uygulama çalışmaları yürütülecek
- Kimlik doğrulama ve hesap güvenliğini doğrudan etkilediği için küçük, dikkatle incelenmiş adımlar halinde yavaşça dağıtılıyor
Güvenlik duyuruları ve standart kitaplık alternatifi yönlendirmeleri
- Mevcut
Securitysekmesi RustSec veritabanındaki güvenlik duyurularını gösteriyor; artık RustSec’in bakımı durduruldu olarak işaretlediği paketlerde sayfanın üst kısmında bir uyarı bandı da görünüyor- Banttan, ayrıntılar ve olası alternatifleri içeren ilgili duyuruya gidilebiliyor
- İşlevi standart kitaplığa alınmış paketlerde “You might not need this dependency” bandı gösteriliyor
- Örneğin
lazy_static, Rust 1.80’den itibarenstd::sync::LazyLockile değiştirilebilir - Bağımlılık listesinde değiştirilmiş paketlerin yanında aynı yönlendirmeyi sunan küçük bir ampul simgesi yer alıyor
- Örneğin
- İlgili veriler yeni rust-lang/std-replacement-data deposunda yönetiliyor
- Yalnızca standart kitaplık alternatif kayıtlarına izin veriliyor
- Her kayıt, kararlı hale gelmiş
std,core,allocAPI’sine ve ilgili Rust sürümüne atıf yapmak zorunda - Kayıt eklenmeden önce paket bakımcılarına haber veriliyor ve görüş bildirmeleri için süre tanınıyor
- Yeni kayıtlar depoya önerilebiliyor; biriken veriler başka araçlar tarafından da kullanılabiliyor
Svelte ön yüz geçişi tamamlandı
- crates.io ön yüzünü Ember.js’ten Svelte’e taşıma denemesi başarıyla sonuçlandı
- Yeni ön yüz, mevcut işlevlerle eşdeğer seviyeye ulaştı
- Nisan ayındaki açık test sürecinin ardından mayıs başında varsayılan ön yüz olarak devreye alındı
- Ember.js uygulaması depodan kaldırıldı
- Mevcut tasarım ve işlevlerin aynen taşındığı bire bir geçiş olduğundan kullanıcıların değişikliği hissetmemesi hedeflendi
- Ekip ve katkı verenler, modern bir framework kullanırken yeni katkıcılar için giriş bariyerini düşürüp yinelemeli geliştirme hızını artırabilir hale geldi; kaynak kod görüntüleyici bunun bir örneği
- crates.io’nun uzun yıllar kullandığı Ember.js ekibine ve geçişi destekleyen Svelte ekibine teşekkür ediliyor
Ferris hata sayfası
- crates.io hata sayfalarındaki Ferris, gözleriyle fare imlecini takip edecek şekilde değiştirildi
- 404 hata sayfasında da küçük bir etkileşim sunuluyor
Arama ve ters bağımlılık sorgulama performansı
- Alakalılığa göre sıralı arama daha önce arama terimiyle eşleşen tüm paketlerin sıralamasını hesaplıyordu; kısa veya yaygın arama terimlerinde bu 1-2 saniye sürebiliyordu
- Artık sıralama hesaplamasının kapsamı, son indirme sayısı en yüksek olan eşleşen 1.000 paketle sınırlandırılıyor
- Ters bağımlılık uç noktası artık her istekte tüm bağımlı paket kümesini yeniden hesaplamıyor
- Veritabanı tetikleyicileriyle senkronize edilen önceden hesaplanmış bir tablodan sonuç sunuyor
- Maliyetli join işlemlerini sınırlı indeks taramasına dönüştürerek zaman aşımı olasılığını büyük ölçüde azaltıyor
Mimari belgesi ve Markdown render’ı
ARCHITECTURE.mdtamamen elden geçirilerek crates.io’nun üst düzey sistemleri ve bunların birbirleriyle nasıl bağlandığı odağa alındıcargo publishçalıştırıldığında gerçekleşen işlem süreci- Tipik paket indirmelerinin neden API sunucusundan geçmediği
- CDN erişim günlüklerinden indirme sayılarının nasıl çıkarıldığı dahil edildi
- README, yaygın kullanılan Markdown uzantılarından tanım listelerini render ediyor
- Markdown render aracı comrak tanım listelerini zaten destekliyordu, ancak bu uzantı etkin değildi
CDN önbellek verimliliği iyileştirmeleri
- Statik CDN’e yüklenen dosyalara önbellek etiketi metaverisi eklendi
- Her dosya URL’si için ayrı geçersizleştirme isteği göndermek yerine, belirli bir paketin veya sürümün tüm önbellek dosyaları tek seferde geçersizleştirilebiliyor
- Herkese açık API yanıtları ve ön yüz varlıklarının CDN’de önbelleğe alınmasını engelleyen genel
Vary: Cookieyanıt başlığı kaldırıldı- Kullanıcıya özel yanıtlarda bunun yerine
Cache-Control: no-storeuygulanıyor - Bunun sonucunda CDN edge’lerinde önbellek isabet oranı iyileşti
- Kullanıcıya özel yanıtlarda bunun yerine
Erişilebilirlik ve Git indeks işleme
- Ekran okuyucu kullanıcıları için crates.io’nun erişilebilirliği iyileştirildi
- Süsleme amaçlı ikonlar erişilebilirlik ağacından gizlendi
- Başlık hiyerarşisi düzeltildi
- Listelere doğru liste işaretlemesi uygulandı
- Regresyonların fark edilmeden yansıtılmasını önlemek için ARIA snapshot testleri getirildi
- Önümüzdeki birkaç ay boyunca erişilebilirliğin iyileştirilmeye devam edilmesi planlanıyor
- Arka plan worker’larının yerel Git indeks kopyası bare ve shallow depoya dönüştürüldü
- Yaklaşık 250 bin checkout dosyası ve tüm commit geçmişi diskten kaldırıldı
- Paket yayımlama sıklığının arttığı ortamda işleme performansı iyileştirildi
- Periyodik indeks squash işlemi, yerelde büyük Git pack oluşturmak yerine GitHub API’sini kullanıyor
- Önceki yerel pack oluşturma yöntemi prodüksiyon worker’larında bellek yetersizliğine yol açmıştı
Geri bildirim kanalları
- crates.io ile ilgili görüş ve sorular Zulip veya GitHub Discussions üzerinden iletilebilir
1 yorum
Lobste.rs görüşleri
crates.io hesabını GitHub'dan ayırmaya yönelik çalışmanın sürüyor olması sevindirici
Kendi alan adımdaki
example@example.come-postasıyla giriş yapmak için,https://example.com/.well-known/webfingeradresinesubjectdeğeriacct:example@example.comolan ve OpenID Connect issuerhrefdeğerihttps://codeberg.orgolan bir JSON dosyası koyuyorumCodeberg ayarlarında yönlendirme URI'si
https://login.tailscale.com/a/oauth_responseolan bir OAuth2 uygulaması oluşturup, verilenClient IDveClient Secretdeğerlerini Tailscale'e girmek yeterli. Görünüşe göre crates.io da ileride benzer bir yöntem sunacakSon zamanlarda crates.io'daki iyileştirmelerin bu kadar kapsamlı olduğunun farkında değildim. Normalde önce lib.rs'ye bakardım ama yakında bu alışkanlığım değişebilir; en çok hoşuma giden değişiklik ise Ferris
Ferris'in gözlerindeki değişim fiziksel olarak pek anlamlı değil. Siyah gözlerde görülen beyaz kısım ayna yansıması kaynaklı parlama, yani fare imleci ışık kaynağıysa bile gözlerin imleci takip ettiği şeklinde yorumlamak zor
Bağımlılıkları denetlerken önce
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/yolunu~/cargosrcolarak sembolik bağlantıyla eşliyorum; böylece Cargo'nun indirdiği dosyalara kolayca erişebiliyorumDenetlenecek her bağımlılık için Git deposunu klonlayıp hedef sürümü checkout ediyorum, ardından izlenen dosyaları yerelde silip rust-analyzer sürecine
SIGSTOPgönderiyorum. ProjeninCargo.tomldosyasına bağımlılığı ekleyipcargo fetchçalıştırdıktan sonra, indirilen$dependency-$versiondizininin içeriğini klonladığım depoya kopyalayıp commitliyor ve Git geçmişi görüntüleyicisinde farkları inceliyorumİnceleme bittiğinde
Cargo.lockiçindeki bağımlılık-sürüm-hash kombinasyonunu bir betikle güvenilir bir veritabanına kaydediyorum; böylece aynı sürümü tekrar kontrol etmiyorum. Süreç karmaşık görünebilir ama büyük kısmını otomatikleştirdiğim için web arayüzünden daha verimli, ayrıca Cargo'nun komut satırında bu tür bir inceleme sürecini desteklemesi iyi olurdu. cargo-crev gibi araçlardan ziyade, incelemenin kendisini kolaylaştıran bir eklenti olup olmadığını da merak ediyorumFrontend'in sadece manifest'i alıp ardından her dosyayı gerektiğinde HTTP range request ile çağırdığı uygulama burada yer alıyor ve tarayıcının yerleşik
DecompressionStreamözelliğini kullanıyor