crates.io डेवलपमेंट अपडेट
(blog.rust-lang.org)- पिछले 6 महीनों में crates.io ने प्रकाशित पैकेजों को सीधे देखने के लिए source code viewer जोड़ा, GitHub से स्वतंत्र अकाउंट सिस्टम पेश किया, और security व standard library replacement guidance को मजबूत किया
- नया
Codeटैब file search, syntax highlighting, और shareable line selection को सपोर्ट करता है; CDN के ZIP·JSON manifest और HTTP range requests के ज़रिए API server पर लोड डाले बिना सिर्फ़ ज़रूरी फाइलें लोड की जाती हैं - RFC #3946 के अनुसार crates.io-विशिष्ट usernames के implementation की शुरुआत हो चुकी है, और username change व security review के बाद भविष्य में GitHub के अलावा अन्य authentication providers को सपोर्ट करने की योजना है
- frontend को Ember.js से पूरी तरह Svelte पर migrate किया गया है, और search, reverse dependency lookup, CDN caching, तथा Git index processing को भी performance और stability बेहतर करने की दिशा में सुधारा गया है
- RustSec के maintenance-discontinued warnings और
std::sync::LazyLockजैसे standard library replacement APIs को package pages पर दिखाकर dependency auditing और अनावश्यक dependencies हटाने में मदद दी जा रही है
प्रकाशित पैकेजों की जाँच के लिए source code viewer
- package page के नए
Codeटैब में crates.io के भीतर ही प्रकाशित हर version की files को browse किया जा सकता है- यह linked repository नहीं, बल्कि वही files दिखाता है जिन्हें
cargodependency जोड़ते समय वास्तव में डाउनलोड करता है cargoद्वारा बनाए गए normalizedCargo.tomlजैसी वे files भी देखी जा सकती हैं जो repository में मौजूद नहीं होतीं, जिससे dependency auditing आसान होती है
- यह linked repository नहीं, बल्कि वही files दिखाता है जिन्हें
- viewer file tree search, syntax highlighting, और GitHub-शैली line selection को सपोर्ट करता है
- line number पर click या drag करने पर
#L10-L20जैसे shareable URL बनते हैं
- line number पर click या drag करने पर
- server सभी published versions के लिए ZIP files और file structure बताने वाला JSON manifest बनाता है
cargoद्वारा उपयोग की जाने वाली.cratefile gzip-compressed tarball होती है जो random access सपोर्ट नहीं करती, इसलिए background job में इसे browse किए जा सकने वाले ZIP में दोबारा package किया जाता है- ZIP और manifest static CDN के ज़रिए serve किए जाते हैं
- frontend पहले manifest लेता है, फिर हर file को ज़रूरत पड़ने पर HTTP range requests से लोड करता है
- source browsing से crates.io API server पर लगभग कोई अतिरिक्त लोड नहीं पड़ता, और पुराने releases तक सपोर्ट देने के लिए existing versions को भी bulk में process किया गया है
- code viewer की rendering library मूल रूप से diff renderer है, और इसी infrastructure पर versions के बीच comparison viewer भी विकसित किया जा रहा है
- पूरा होने पर crates.io में प्रकाशित दो versions के बीच हुए सटीक बदलावों की समीक्षा की जा सकेगी
GitHub से स्वतंत्र होते crates.io accounts
- crates.io टीम ने मई के अंत में RFC #3946 को approve किया
- पहले GitHub login और crates.io identity काफ़ी मज़बूती से जुड़े हुए थे, और username भी GitHub account से तय होता था, लेकिन RFC linked account से स्वतंत्र crates.io-विशिष्ट username लाता है
- यह अलग username भविष्य में GitHub के अलावा अन्य authentication providers के जरिए login सपोर्ट करने के लिए prerequisite है
- implementation शुरू हो चुका है, लेकिन users को दिखने वाली प्रमुख अधूरी सुविधा अभी username change है
- इसके पूरा होने के बाद अन्य authentication provider logins पर अतिरिक्त RFC और implementation आगे बढ़ेंगे
- authentication और account security पर सीधे असर होने के कारण इसे छोटे, सावधानी से review किए गए चरणों में धीरे-धीरे rollout किया जा रहा है
security advisories और standard library replacements की guidance
- मौजूदा
Securityटैब RustSec database की security advisories दिखाता है, और अब जिन packages को RustSec maintenance-discontinued के रूप में चिह्नित करता है उनके page के शीर्ष पर warning banner भी दिखाई देता है- banner से संबंधित advisory पर जाया जा सकता है, जहाँ details और संभावित alternatives दिए होते हैं
- जिन packages की functionality standard library में शामिल हो चुकी है, उनके लिए “You might not need this dependency” banner दिखाया जाता है
- उदाहरण के लिए
lazy_staticको Rust 1.80 सेstd::sync::LazyLockसे replace किया जा सकता है - dependency list में replace किए गए packages पर यही guidance देने वाला छोटा bulb icon भी लगाया जाता है
- उदाहरण के लिए
- संबंधित data नए rust-lang/std-replacement-data repository में manage किया जाता है
- इसमें केवल standard library replacement entries की अनुमति है
- हर entry में stabilized
std,core,allocAPI और संबंधित Rust version का उल्लेख होना चाहिए - entry जोड़ने से पहले package maintainer को सूचित किया जाता है और feedback देने का समय दिया जाता है
- नई entries repository में propose की जा सकती हैं, और इकट्ठा किया गया data अन्य tools में भी उपयोगी हो सकता है
Svelte frontend migration पूरा
- crates.io frontend को Ember.js से Svelte में ले जाने का experiment सफलतापूर्वक पूरा हो गया
- नया frontend मौजूदा features के बराबर स्तर तक पहुँच चुका है
- अप्रैल में public testing के बाद मई की शुरुआत में इसे default frontend बना दिया गया
- Ember.js application को repository से हटा दिया गया
- यह मौजूदा design और functionality की one-to-one migration थी, ताकि users को बदलाव लगभग महसूस न हो
- टीम और contributors अब modern framework का उपयोग करते हुए नए contributors के लिए entry barrier कम कर सकते हैं और iterative development की रफ़्तार बढ़ा सकते हैं; source code viewer इसका एक उदाहरण है
- crates.io ने कई वर्षों तक जिस Ember.js का उपयोग किया और migration में मदद करने वाली Svelte टीम, दोनों को धन्यवाद दिया गया
Ferris error pages
- crates.io error pages में Ferris अब mouse cursor को अपनी आँखों से follow करता है
- 404 error page में भी एक छोटा interaction जोड़ा गया है
search और reverse dependency lookup performance
- relevance-based search पहले query से match करने वाले सभी packages की ranking calculate करता था, इसलिए छोटे या बहुत सामान्य queries पर 1–2 सेकंड लग सकते थे
- अब ranking calculation को हालिया downloads के हिसाब से शीर्ष 1,000 matching packages तक सीमित कर दिया गया है
- reverse dependency endpoint अब हर request पर पूरे dependent package set की दोबारा calculation नहीं करता
- results अब database trigger से sync होने वाली precomputed table से दिए जाते हैं
- इससे महँगे joins की जगह limited index scans का उपयोग होता है और timeout की संभावना काफ़ी कम हो जाती है
architecture docs और Markdown rendering
ARCHITECTURE.mdको पूरी तरह revamp किया गया है, जिसमें crates.io के high-level systems और उनके interconnections पर ज़ोर हैcargo publishचलने पर होने वाली processing- सामान्य package download API server से होकर क्यों नहीं जाते
- CDN access logs से download counts कैसे निकाले जाते हैं, यह शामिल है
- README अब widely used Markdown extension definition lists render करता है
- Markdown renderer comrak पहले से definition lists सपोर्ट करता था, लेकिन वह extension enabled नहीं थी
CDN cache efficiency में सुधार
- static CDN पर upload होने वाली files में cache tag metadata जोड़ा गया है
- हर file URL के लिए अलग invalidation request भेजने के बजाय किसी खास package या release की सभी cache files को एक साथ invalidate किया जा सकता है
- public API responses और frontend assets की CDN caching को बाधित करने वाला global
Vary: Cookieresponse header हटा दिया गया है- user-specific responses पर अब इसके बजाय
Cache-Control: no-storeलागू होता है - इससे CDN edge पर cache hit rate में सुधार हुआ है
- user-specific responses पर अब इसके बजाय
accessibility और Git index processing
- screen reader users के लिए crates.io की accessibility बेहतर की गई है
- decorative icons को accessibility tree से छिपाया गया है
- heading hierarchy को ठीक किया गया है
- lists पर सही list markup लागू किया गया है
- ARIA snapshot tests जोड़े गए हैं ताकि regressions बिना पकड़े merge न हो जाएँ
- आने वाले महीनों में accessibility को और बेहतर करने की योजना है
- background workers की local Git index copies को bare, shallow repositories में बदला गया है
- इससे लगभग 2.5 लाख checked-out files और पूरा commit history disk से हट गया
- package publishing frequency बढ़ने की स्थिति में processing performance बेहतर हुई है
- periodic index squash अब local में बड़े Git pack बनाने के बजाय GitHub API का उपयोग करता है
- पहले local pack generation के कारण production workers में out-of-memory समस्याएँ आई थीं
feedback channels
- crates.io से जुड़ी राय और सवाल Zulip या GitHub Discussions में साझा किए जा सकते हैं
1 टिप्पणियां
Lobste.rs की राय
यह देखकर अच्छा लगा कि crates.io अकाउंट को GitHub से अलग करने पर काम चल रहा है
अपने domain के email
example@example.comसे login करने के लिएhttps://example.com/.well-known/webfingerपर एक JSON file रखें, जिसमेंsubjectacct:example@example.comहो और OpenID Connect issuer काhrefhttps://codeberg.orgहोCodeberg settings में redirect URI
https://login.tailscale.com/a/oauth_responseवाला OAuth2 application बनाएं, फिर जारी किए गएClient IDऔरClient Secretको Tailscale में डाल दें। लगता है आगे crates.io भी कुछ इसी तरह का तरीका देगामुझे पता ही नहीं था कि हाल में crates.io में सुधारों का दायरा इतना बड़ा हो गया है। आम तौर पर मैं पहले lib.rs देखता था, लेकिन शायद जल्द ही यह आदत बदल जाए; सबसे पसंद आया बदलाव Ferris है
Ferris की आंखों में बदलाव भौतिक रूप से बहुत सही नहीं बैठता। काली आंखों के सफेद हिस्से specular highlights हैं, और अगर mouse cursor light source है, तो इसे यह कहना भी मुश्किल है कि आंखें cursor को follow कर रही हैं
dependencies audit करते समय पहले
~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/को~/cargosrcसे symbolic link करता हूं, ताकि Cargo द्वारा download की गई files तक आसानी से पहुंच होaudit की जाने वाली हर dependency के लिए Git repository clone करता हूं, target version checkout करता हूं, tracked files को local में delete करता हूं, फिर rust-analyzer process को
SIGSTOPभेजता हूं। project केCargo.tomlमें dependency जोड़करcargo fetchचलाता हूं, फिर download हुई$dependency-$versiondirectory की सामग्री clone की गई repository में copy करके commit करता हूं और Git history viewer में अंतर देखता हूंreview खत्म होने पर
Cargo.lockकी dependency, version और hash combination को script के जरिए भरोसेमंद database में save कर देता हूं, ताकि उसी version को फिर से check न करना पड़े। प्रक्रिया जटिल दिखती है, लेकिन इसका बड़ा हिस्सा automate किया हुआ है, इसलिए यह web UI से ज्यादा efficient है; अच्छा होगा अगर Cargo command line से ऐसे review workflow को support करे। यह भी जानना चाहता हूं कि cargo-crev जैसे tools के बजाय review में ही मदद करने वाला कोई plugin है क्याfrontend द्वारा सिर्फ manifest लाने के बाद हर file को जरूरत पड़ने पर HTTP range requests से load करने वाली implementation यहां है, और यह browser के built-in
DecompressionStreamका उपयोग करती है