این صفحه نحوه ایجاد قوانین مخزن را پوشش می دهد و مثال هایی برای جزئیات بیشتر ارائه می دهد.
مخزن خارجی قاعده ای است که فقط در فایل WORKSPACE
قابل استفاده است و عملیات غیر هرمتیک را در مرحله بارگیری Bazel فعال می کند. هر قانون مخزن خارجی فضای کاری خود را با فایلها و مصنوعات BUILD
خود ایجاد میکند. آنها را می توان برای وابستگی به کتابخانه های شخص ثالث (مانند کتابخانه های بسته بندی شده Maven) و همچنین برای تولید فایل های BUILD
مخصوص میزبانی که Bazel روی آن در حال اجرا است استفاده کرد.
ایجاد قانون مخزن
در یک فایل .bzl
. از تابع repository_rule برای ایجاد یک قانون مخزن جدید و ذخیره آن در یک متغیر سراسری استفاده کنید.
یک قانون مخزن سفارشی می تواند درست مانند یک قانون مخزن بومی استفاده شود. این یک ویژگی name
اجباری دارد و هر هدف موجود در فایلهای ساخت آن را میتوان بهعنوان @<name>//package:target
که در آن <name>
مقدار مشخصه name
است نام برد.
این قانون زمانی بارگذاری میشود که شما به صراحت آن را میسازید، یا اگر وابسته به ساخت باشد. در این صورت بازل تابع implementation
خود را اجرا خواهد کرد. این تابع نحوه ایجاد مخزن، محتوای آن و فایل های BUILD
را توضیح می دهد.
ویژگی های
یک ویژگی یک آرگومان قانون است، مانند url
یا sha256
. هنگام تعریف یک قانون مخزن، باید صفات و انواع آنها را فهرست کنید.
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
برای دسترسی به یک ویژگی، از repository_ctx.attr.<attribute_name>
.
همه repository_rule
دارای ویژگی های ضمنی تعریف شده هستند (درست مانند قوانین ساخت). دو ویژگی ضمنی عبارتند از name
(درست مانند قوانین ساخت) و repo_mapping
. نام یک قانون مخزن با repository_ctx.name
قابل دسترسی است. معنای repo_mapping
مانند قوانین مخزن بومی local_repository
و new_local_repository
است.
اگر نام ویژگی با _
شروع شود، خصوصی است و کاربران نمی توانند آن را تنظیم کنند.
تابع پیاده سازی
هر قانون مخزن به یک تابع implementation
نیاز دارد. این شامل منطق واقعی قانون است و به شدت در فاز بارگذاری اجرا می شود.
این تابع دقیقاً یک پارامتر ورودی دارد، repository_ctx
. تابع یا None
را برمی گرداند تا نشان دهد که قانون با توجه به پارامترهای مشخص شده قابل تکرار است، یا یک دستور با مجموعه ای از پارامترها برای آن قانون که آن قانون را به یک قانون تکرارپذیر تبدیل می کند که همان مخزن را تولید می کند. به عنوان مثال، برای قانون ردیابی یک مخزن git که به معنای بازگرداندن یک شناسه commit خاص به جای یک شاخه شناور است که در ابتدا مشخص شده بود.
پارامتر ورودی repository_ctx
را می توان برای دسترسی به مقادیر ویژگی و توابع غیرهرمتیک (پیدا کردن یک باینری، اجرای یک باینری، ایجاد یک فایل در مخزن یا دانلود یک فایل از اینترنت) استفاده کرد. برای اطلاعات بیشتر به کتابخانه مراجعه کنید. مثال:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
تابع پیاده سازی چه زمانی اجرا می شود؟
اگر مخزن به عنوان local
اعلام شود، تغییر در یک وابستگی در نمودار وابستگی (از جمله خود فایل WORKSPACE
) باعث اجرای تابع پیاده سازی می شود.
اگر یک وابستگی درخواستی وجود نداشته باشد، تابع پیاده سازی می تواند دوباره راه اندازی شود. شروع تابع پیاده سازی پس از رفع وابستگی مجدداً اجرا می شود. برای جلوگیری از راه اندازی مجدد غیرضروری (که گران هستند، زیرا دسترسی به شبکه ممکن است تکرار شود)، آرگومان های برچسب از قبل واکشی می شوند، مشروط بر اینکه بتوان همه آرگومان های برچسب را در یک فایل موجود حل کرد. توجه داشته باشید که حل یک مسیر از یک رشته یا یک برچسب که فقط در حین اجرای تابع ساخته شده است ممکن است همچنان باعث راه اندازی مجدد شود.
در نهایت، برای مخازن غیر local
، تنها تغییر در وابستگی های زیر ممکن است باعث راه اندازی مجدد شود:
- فایل های
.bzl
برای تعریف قانون مخزن مورد نیاز است. - اعلام قانون مخزن در فایل
WORKSPACE
. - مقدار هر متغیر محیطی که با ویژگی
environ
تابعrepository_rule
اعلام شده است. مقدار آن متغیر محیطی را می توان از خط فرمان با پرچم--action_env
کرد (اما این پرچم هر اقدام ساخت را باطل می کند). - محتوای هر فایلی که استفاده میشود و توسط یک برچسب به آن ارجاع میشود (به عنوان مثال،
//mypkg:label.txt
نهmypkg/label.txt
).
بازیابی اجباری مخازن خارجی
گاهی اوقات، یک مخزن خارجی میتواند بدون تغییر در تعریف یا وابستگیهای آن قدیمی شود. به عنوان مثال، منابع واکشی مخزن ممکن است از یک شاخه خاص از یک مخزن شخص ثالث پیروی کنند و تعهدات جدید در آن شعبه موجود است. در این حالت، میتوانید از bazel بخواهید تا با فراخوانی bazel bazel sync
، همه مخازن خارجی را بدون قید و شرط بازیابی کند.
علاوه بر این، برخی از قوانین ماشین محلی را بازرسی می کنند و ممکن است در صورت ارتقاء ماشین محلی قدیمی شوند. در اینجا میتوانید از bazel بخواهید که فقط آن مخازن خارجی را که تعریف repository_rule
دارای مجموعه ویژگیهای configure
است، بازیابی کند، از bazel sync --configure
استفاده کنید.
مثال ها
زنجیره ابزار با پیکربندی خودکار C++ : از یک قانون مخزن برای ایجاد خودکار فایل های پیکربندی C++ برای Bazel با جستجوی کامپایلر محلی C++، محیط و پرچم هایی که کامپایلر C++ پشتیبانی می کند، استفاده می کند.
مخازن Go از چندین
repository_rule
برای تعریف لیستی از وابستگی های مورد نیاز برای استفاده از قوانین Go استفاده می کند.rules_jvm_external یک مخزن خارجی به نام
@maven
به طور پیشفرض ایجاد میکند که برای هر آرتیفکت Maven در درخت وابستگی گذرا، اهداف ساخت ایجاد میکند.