مقایسه Chromium و اکوسیستم Cargo
جامعه Rust معمولاً از cargo و کتابخانههای crates.io استفاده میکند. Chromium با استفاده از gn و ninja و مجموعهای از وابستگیها ساخته شده است.
هنگام نوشتن کد در Rust، انتخابهای شما عبارتند از:
- از
gnوninjaبا کمک الگوهای//build/rust/*.gniاستفاده کنید (مثلاًrust_static_libraryکه بعداً با آن آشنا خواهیم شد). این از toolchain و crateهای بررسیشده Chromium استفاده میکند. - از
cargoاستفاده کنید، اما خود را به toolchain و crateهای بررسیشده Chromium محدود کنید - از
cargoاستفاده کنید، به یک toolchain و/یا [crateهای دانلود شده از اینترنت](https://crates.io/) اعتماد کنید.
از اینجا به بعد ما روی gn و ninja تمرکز خواهیم کرد، زیرا به این ترتیب میتوان کد Rust را در مرورگر Chromium ایجاد کرد. در عین حال، Cargo بخش مهمی از اکوسیستم Rust است و شما باید آن را در جعبه ابزار خود نگه دارید.
خرده تمرین
به گروههای کوچک تقسیم شده و:
- سناریوهای طوفان فکری که در آن
cargoممکن است مزیتی را ارائه دهد و نمایه ریسکهای این سناریوها را ارزیابی کند. - در هنگام استفاده از
gnوninjaوcargoآفلاین و غیره در مورد ابزارها، کتابخانهها و گروههایی از افراد بحث کنید.
از دانشآموزان بخواهید که قبل از اتمام تمرین از نگاه کردن به یادداشتهای سخنران خودداری کنند. با فرض اینکه افرادی که دوره را میگذرانند از نظر فیزیکی با هم هستند، از آنها بخواهید در گروه های کوچک ۳-۴ نفره بحث کنند.
نکتهها/تکنیکها مربوط به بخش اول تمرین (“سناریوهایی که Cargo ممکن است مزیتی را ارائه دهد”):
-
این فوق العاده است که هنگام نوشتن یک ابزار یا نمونهسازی بخشی از Chromium به اکوسیستم غنی کتابخانههای crates.io دسترسی داشته باشید. تقریباً برای هر چیزی یک crate وجود دارد و معمولاً استفاده از آنها بسیار لذت بخش است. (
clapبرای تجزیه خط فرمان،serdeبرای سریالسازی/جداسازیسریال به/از قالبهای مختلف،itertoolsبرای کار با تکرارکنندهها (iterators) و غیره).-
cargoبررسی کردن یک کتابخانه را آسان میکند (فقط یک خط بهCargo.tomlاضافه کنید و شروع به نوشتن کد کنید) - شاید ارزش این را داشته باشد که چگونه CPAN به انتخاب
perlکمک کرد. یا مقایسه باpython+pip.
-
-
Development experience is made really nice not only by core Rust tools (e.g. using
rustupto switch to a differentrustcversion when testing a crate that needs to work on nightly, current stable, and older stable) but also by an ecosystem of third-party tools (e.g. Mozilla providescargo vetfor streamlining and sharing security audits;criterioncrate gives a streamlined way to run benchmarks).-
cargoافزودن ابزارها را از طریقcargo install --locked cargo-vetتسهیل میکند. - ممکن است ارزش مقایسه با برنامههای افزودنی کروم یا افزونههای VScode را داشته باشد.
-
-
نمونههای کلی و عمومی از پروژههایی که
cargoممکن است انتخاب مناسبی باشد:- شاید تعجبآور باشد که Rust به طور فزاینده ای در صنعت برای نوشتن ابزارهای خط فرمان محبوب میشود. گستردگی و ارگونومی کتابخانهها با پایتون قابل مقایسه است، درحالیکه قویتر (به لطف تایپ سیستم غنی) است و سریعتر کار میکند (به عنوان یک زبان کامپایل شده و نه مفسری).
- مشارکت در اکوسیستم Rust مستلزم استفاده از ابزار استاندارد Rust مانند Cargo است. کتابخانههایی که میخواهند مشارکتهای خارجی دریافت کنند و میخواهند خارج از Chromium استفاده شوند (مثلاً در محیطهای ساخت Bazel یا Android/Soong) احتمالاً باید از Cargo استفاده کنند.
-
نمونههایی از پروژههای مرتبط با Chromium که مبتنی بر
cargoهستند:-
serde_json_lenient(در قسمتهای دیگر Google آزمایش شده که منجر به PRهایی با بهبود در عملکرد میباشد.) - کتابخانههای فونت مانند
font-types - ابزار
gnrt(ما بعداً در دوره با آن آشنا خواهیم شد) که برای تجزیه خط فرمان بهclapو برای فایلهای پیکربندی بهtomlبستگی دارد.- Disclaimer: a unique reason for using
cargowas unavailability ofgnwhen building and bootstrapping Rust standard library when building Rust toolchain. -
run_gnrt.pyاز کپی Chromium ازcargoوrustcاستفاده میکند.gnrtبه کتابخانههای شخص ثالثی بستگی دارد که از اینترنت دانلود شدهاند، اماrun_gnrt.pyازcargoمیپرسد که فقط محتوای--lockedاز طریقCargo.lockمجاز است.)
- Disclaimer: a unique reason for using
-
دانشآموزان ممکن است موارد زیر را به طور ضمنی یا صریح مورد اعتماد تشخیصدهند:
rustc(کامپایلر Rust) که به نوبه خود به کتابخانههای LLVM، کامپایلر Clang، منابعrustc(برگرفته از GitHub، بررسی شده توسط تیم کامپایلر Rust) وابسته است، کامپایلر Rust باینری که برای راهاندازی بارگیری (bootstrapping) شده است-
rustup(شاید شایان ذکر است کهrustupزیر چتر سازمان https://github.com/rust-lang/ - همانندrustcتوسعه یافته است) cargo,rustfmt,سایر موارد.- زیرساختهای داخلی مختلف (رباتهایی که
rustcمیسازند، سیستمی برای توزیع toolchain از پیشساخته شده بین مهندسان Chromium و بقیغ) - ابزار Cargo مانند
cargo audit،cargo vetو غیره. - کتابخانههای Rust در
//third_party/rustعرضه شده است (بازرسی شده توسط security@chromium.org) - سایر کتابخانههای Rust (بعضی خاص، برخی کاملاً محبوب و پرکاربرد)