مقایسه 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
rustup
to switch to a differentrustc
version 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 vet
for streamlining and sharing security audits;criterion
crate 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
cargo
was unavailability ofgn
when 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 (بعضی خاص، برخی کاملاً محبوب و پرکاربرد)