مقدمه

با رشد یک پروژه، ممکن است به نقطه‌ای برسیم که بخواهیم آن را به چندین کتابخانه (crate) مجزا تقسیم کنیم. برای مثال، در پروژه minigrep ما، می‌توانیم منطق اصلی جستجو را در یک crate کتابخانه‌ای و بخش اجرایی خط فرمان را در یک crate باینری که از آن کتابخانه استفاده می‌کند، قرار دهیم.

«فضای کاری» یا Workspace یک قابلیت در Cargo است که به ما کمک می‌کند تا چندین پکیج مرتبط را که با هم توسعه داده می‌شوند، مدیریت کنیم. با استفاده از یک workspace، تمام پکیج‌ها یک فایل قفل مشترک (Cargo.lock) و یک پوشه خروجی واحد (target) را به اشتراک می‌گذارند. این کار باعث می‌شود که وابستگی‌ها هماهنگ باقی بمانند و فرآیند بیلد بهینه‌تر شود.

ایجاد یک Workspace

بیایید پروژه minigrep را به یک workspace تبدیل کنیم که شامل یک crate باینری برای بخش اجرایی و یک crate کتابخانه‌ای برای منطق اصلی باشد.

ابتدا یک پوشه جدید به نام minigrep-workspace می‌سازیم و داخل آن، یک فایل Cargo.toml در سطح بالا ایجاد می‌کنیم. این فایل پیکربندی کل workspace را مشخص خواهد کرد.

Copy Icon Cargo.toml
[workspace]
members = [
    "minigrep",
    "minigrep_lib",
]

بخش [workspace] به Cargo می‌گوید که این یک workspace است و کلید members لیستی از پکیج‌هایی که در این workspace قرار دارند را مشخص می‌کند.

ایجاد پکیج‌ها در Workspace

حالا دو پکیج را در داخل workspace ایجاد می‌کنیم.

$ cargo new minigrep
$ cargo new minigrep_lib --lib
                    

پکیج اول، minigrep، بخش باینری و اجرایی خواهد بود. پکیج دوم، minigrep_lib، یک پکیج کتابخانه‌ای است که منطق اصلی را در خود جای خواهد داد. حالا باید پکیج minigrep را طوری تنظیم کنیم که به minigrep_lib به عنوان یک وابستگی محلی (path dependency) ارجاع دهد.

Copy Icon minigrep/Cargo.toml
[dependencies]
minigrep_lib = { path = "../minigrep_lib" }

مزایای استفاده از Workspace

استفاده از workspace چندین مزیت کلیدی دارد:

  • وابستگی‌های مشترک: تمام crateها در workspace از یک فایل Cargo.lock واحد استفاده می‌کنند. این یعنی اگر چندین crate به یک وابستگی خارجی یکسان (مثلاً `rand`) نیاز داشته باشند، همگی از یک نسخه یکسان از آن استفاده خواهند کرد.
  • پوشه target مشترک: تمام خروجی‌های کامپایل در یک پوشه target در سطح ریشه workspace ذخیره می‌شوند که از تکرار بیلدها جلوگیری کرده و فضای دیسک را بهینه می‌کند.
  • اجرای دستورات در سطح Workspace: شما می‌توانید دستوراتی مانند cargo build یا cargo test را از پوشه ریشه workspace اجرا کنید و Cargo تمام پکیج‌های عضو را بیلد یا تست خواهد کرد.

برای اجرای یک پکیج باینری خاص در داخل workspace، باید از فلگ -p (مخفف package) استفاده کنید:

$ cargo run -p minigrep
                    

وابستگی‌های خارجی در Workspace

وابستگی‌های خارجی تنها باید به فایل Cargo.toml پکیجی اضافه شوند که مستقیماً از آنها استفاده می‌کند. Cargo به صورت هوشمند مدیریت می‌کند که هر وابستگی تنها یک بار دانلود و کامپایل شود و بین تمام پکیج‌های داخل workspace که به آن نیاز دارند، به اشتراک گذاشته شود.

در این درس با مفهوم Cargo Workspaces به عنوان یک ابزار قدرتمند برای مدیریت پروژه‌هایی که از چندین پکیج مرتبط تشکیل شده‌اند، آشنا شدیم. دیدیم که چگونه با ایجاد یک workspace می‌توانیم وابستگی‌ها و فرآیندهای بیلد را به صورت متمرکز و بهینه مدیریت کنیم. این قابلیت برای توسعه کتابخانه‌ها و ابزارهای بزرگ در Rust ضروری است. در درس بعدی، به بررسی دستور cargo install خواهیم پرداخت و یاد می‌گیریم که چگونه پکیج‌های باینری را از crates.io یا منابع دیگر نصب کرده و از آنها به عنوان ابزارهای خط فرمان استفاده کنیم.