مقایسه 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 different rustc 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 provides cargo 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 of gn 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 مجاز است.)

دانش‌آموزان ممکن است موارد زیر را به طور ضمنی یا صریح مورد اعتماد تشخیص‌دهند:

  • 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 (بعضی خاص، برخی کاملاً محبوب و پرکاربرد)