مقدمه
با رشد یک پروژه، ممکن است به نقطهای برسیم که بخواهیم آن را به چندین کتابخانه (crate)
مجزا تقسیم کنیم. برای مثال، در پروژه minigrep ما، میتوانیم منطق اصلی جستجو را در یک
crate کتابخانهای و بخش اجرایی خط فرمان را در یک crate باینری که از آن کتابخانه
استفاده میکند، قرار دهیم.
«فضای کاری» یا Workspace یک قابلیت در Cargo است که به ما کمک میکند تا چندین پکیج
مرتبط را که با هم توسعه داده میشوند، مدیریت کنیم. با استفاده از یک workspace، تمام
پکیجها یک فایل قفل مشترک (Cargo.lock) و یک پوشه خروجی واحد (target) را به اشتراک
میگذارند. این کار باعث میشود که وابستگیها هماهنگ باقی بمانند و فرآیند بیلد بهینهتر شود.
ایجاد یک Workspace
بیایید پروژه minigrep را به یک workspace تبدیل کنیم که شامل یک crate باینری
برای بخش اجرایی و یک crate کتابخانهای برای منطق اصلی باشد.
ابتدا یک پوشه جدید به نام minigrep-workspace میسازیم و داخل آن، یک فایل
Cargo.toml در سطح بالا ایجاد میکنیم. این فایل پیکربندی کل workspace را مشخص خواهد
کرد.
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) ارجاع دهد.
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 یا منابع دیگر نصب
کرده و از آنها به عنوان ابزارهای خط فرمان استفاده کنیم.