فضاهای کاری، بسته ها و اهداف

Bazel نرم افزاری را از کد منبع سازماندهی شده در درخت دایرکتوری به نام فضای کاری می سازد. فایل های منبع در فضای کاری در یک سلسله مراتب تودرتو از بسته ها سازماندهی شده اند، که در آن هر بسته یک دایرکتوری است که شامل مجموعه ای از فایل های منبع مرتبط و یک فایل BUILD است. فایل BUILD مشخص می کند که چه خروجی های نرم افزاری را می توان از منبع ساخت.

فضای کاری

فضای کاری یک درخت دایرکتوری در سیستم فایل شما است که حاوی فایل های منبع نرم افزاری است که می خواهید بسازید. هر فضای کاری یک فایل متنی به نام WORKSPACE دارد که ممکن است خالی باشد یا ممکن است حاوی ارجاعاتی به وابستگی های خارجی مورد نیاز برای ساخت خروجی ها باشد.

دایرکتوری هایی که حاوی فایلی به نام WORKSPACE هستند، ریشه یک فضای کاری در نظر گرفته می شوند. بنابراین، Bazel هر درخت دایرکتوری را در یک فضای کاری که در یک زیر شاخه حاوی یک فایل WORKSPACE ریشه دارد، نادیده می گیرد، زیرا آنها فضای کاری دیگری را تشکیل می دهند.

Bazel همچنین از فایل WORKSPACE.bazel به عنوان نام مستعار فایل WORKSPACE پشتیبانی می کند. اگر هر دو فایل وجود داشته باشد، WORKSPACE.bazel استفاده می شود.

مخازن

کد در مخازن سازماندهی شده است. دایرکتوری حاوی فایل WORKSPACE ریشه مخزن اصلی است که @ نیز نامیده می شود. سایر مخازن (خارجی) در فایل WORKSPACE با استفاده از قوانین فضای کاری تعریف شده اند.

قوانین فضای کاری همراه با Bazel در بخش قوانین فضای کاری در دایره المعارف ساخت و مستندات قوانین مخزن Starlark جاسازی شده مستند شده است.

از آنجایی که مخازن خارجی خود مخازن هستند، اغلب حاوی یک فایل WORKSPACE نیز هستند. با این حال، این فایل‌های WORKSPACE اضافی توسط Bazel نادیده گرفته می‌شوند. به ویژه، مخازن وابسته به گذرا به طور خودکار اضافه نمی شوند.

بسته ها

واحد اولیه سازماندهی کد در یک مخزن بسته است. یک بسته مجموعه ای از فایل های مرتبط و مشخصاتی است که نشان می دهد چگونه می توان از آنها برای تولید مصنوعات خروجی استفاده کرد.

بسته به عنوان دایرکتوری حاوی فایلی به نام BUILD (یا BUILD.bazel ) تعریف می شود. یک بسته شامل همه فایل‌های موجود در فهرست خود، به اضافه همه زیرشاخه‌های زیر آن است، به جز مواردی که خود حاوی یک فایل BUILD هستند. از این تعریف، هیچ فایل یا دایرکتوری ممکن است بخشی از دو بسته متفاوت باشد.

به عنوان مثال، در درخت فهرست زیر دو بسته وجود دارد، my/app و زیر بسته my/app/tests . توجه داشته باشید که my/app/data یک بسته نیست، بلکه دایرکتوری متعلق به بسته my/app است.

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

اهداف

پکیج محفظه ای از اهداف است که در فایل BUILD بسته تعریف شده است. بیشتر اهداف یکی از دو نوع اصلی، فایل ها و قوانین هستند.

فایل ها بیشتر به دو نوع تقسیم می شوند. فایل های منبع معمولاً با تلاش افراد نوشته می شوند و در مخزن بررسی می شوند. فایل‌های تولید شده ، که گاهی اوقات فایل‌های مشتق شده یا فایل‌های خروجی نامیده می‌شوند، بررسی نمی‌شوند، اما از فایل‌های منبع تولید می‌شوند.

نوع دوم هدف با یک قانون اعلام می شود. هر نمونه قانون رابطه بین مجموعه ای از ورودی و مجموعه ای از فایل های خروجی را مشخص می کند. ورودی های یک قانون ممکن است فایل های منبع باشند، اما ممکن است خروجی قوانین دیگر نیز باشند.

اینکه ورودی یک قانون یک فایل منبع باشد یا یک فایل تولید شده در بیشتر موارد بی اهمیت است. آنچه مهم است فقط محتویات آن فایل است. این واقعیت جایگزینی یک فایل منبع پیچیده با یک فایل تولید شده توسط یک قانون را آسان می کند، مانند زمانی که بار نگهداری دستی یک فایل بسیار ساختاریافته بسیار خسته کننده می شود و شخصی برنامه ای را برای استخراج آن می نویسد. هیچ تغییری برای مصرف کنندگان آن فایل لازم نیست. برعکس، یک فایل تولید شده ممکن است به راحتی با یک فایل منبع با تغییرات محلی جایگزین شود.

ورودی های یک قانون ممکن است شامل قوانین دیگری نیز باشد. معنای دقیق چنین روابطی اغلب کاملاً پیچیده و وابسته به زبان یا قانون است، اما به طور شهودی ساده است: یک قانون کتابخانه C++ A ممکن است قانون کتابخانه C ++ دیگری را برای ورودی داشته باشد. اثر این وابستگی این است که فایل‌های هدر B در طول کامپایل در دسترس A هستند، نمادهای B در هنگام پیوند در دسترس A هستند، و داده‌های زمان اجرا B در طول اجرا در دسترس A هستند.

یک تغییر ناپذیر از همه قوانین این است که فایل های تولید شده توسط یک قانون همیشه به همان بسته ای تعلق دارند که خود قانون وجود دارد. امکان تولید فایل در بسته دیگری وجود ندارد. با این حال، این غیرمعمول نیست که ورودی های یک قانون از بسته دیگری می آیند.

گروه های بسته مجموعه ای از بسته ها هستند که هدف آنها محدود کردن دسترسی به قوانین خاص است. گروه های بسته توسط تابع package_group تعریف می شوند. آنها سه ویژگی دارند: لیست بسته هایی که در خود دارند، نام آنها و سایر گروه های بسته ای که شامل می شوند. تنها راه های مجاز برای ارجاع به آنها از ویژگی visibility قوانین یا از ویژگی default_visibility تابع package است. آنها فایل تولید یا مصرف نمی کنند. برای اطلاعات بیشتر، به مستندات package_group مراجعه کنید.

برچسب‌ها