برچسب ها

همه اهداف دقیقاً به یک بسته تعلق دارند. نام یک هدف، برچسب آن نامیده می شود. هر برچسب به طور منحصر به فرد یک هدف را مشخص می کند. یک برچسب معمولی به شکل متعارف به نظر می رسد:

@myrepo//my/app/main:app_binary

اولین قسمت برچسب، نام مخزن، @myrepo// است. در حالت معمولی که یک برچسب به همان مخزنی که از آن استفاده می شود اشاره دارد، شناسه مخزن ممکن است به صورت اختصاری // باشد. بنابراین، در @myrepo این برچسب معمولاً به صورت نوشته می‌شود

//my/app/main:app_binary

قسمت دوم برچسب، نام بسته بدون واجد شرایط my/app/main است، مسیر بسته نسبت به ریشه مخزن. با هم، نام مخزن و نام بسته غیرمجاز، نام بسته کاملاً واجد شرایط @myrepo//my/app/main تشکیل می‌دهند. وقتی برچسب به همان بسته ای اشاره می کند که در آن استفاده می شود، نام بسته (و در صورت اختیاری، دو نقطه) ممکن است حذف شود. بنابراین، در داخل @myrepo//my/app/main ، این برچسب ممکن است به یکی از روش‌های زیر نوشته شود:

app_binary
:app_binary

این یک موضوع قراردادی است که کولون برای فایل‌ها حذف می‌شود، اما برای قوانین حفظ می‌شود، اما در غیر این صورت مهم نیست.

بخشی از برچسب بعد از کولون، app_binary نام هدف نامشخص است. هنگامی که با آخرین مؤلفه مسیر بسته مطابقت دارد، ممکن است آن و کولون حذف شوند. بنابراین، این دو برچسب معادل هستند:

//my/app/lib
//my/app/lib:lib

نام هدف فایل در زیر شاخه بسته، مسیر فایل نسبت به ریشه بسته (دایرکتوری حاوی فایل BUILD ) است. بنابراین، این فایل در زیر شاخه my/app/main/testdata مخزن قرار دارد:

//my/app/main:testdata/input.txt

رشته‌هایی مانند //my/app و @some_repo//my/app بسته به زمینه‌ای که در آن استفاده می‌شود دو معنی دارند: وقتی Bazel انتظار یک برچسب را دارد، به معنی //my/app:app و @some_repo//my/app:app ، به ترتیب. اما، زمانی که Bazel انتظار یک بسته را دارد (به عنوان مثال در مشخصات package_group )، آنها به بسته ای که حاوی آن برچسب است ارجاع می دهند.

یک اشتباه رایج در فایل‌های BUILD استفاده از //my/app برای ارجاع به یک بسته یا به تمام اهداف موجود در یک بسته است - اینطور نیست. به یاد داشته باشید، معادل //my/app:app است، بنابراین هدف app را در بسته my/app مخزن فعلی نام‌گذاری می‌کند.

با این حال، استفاده از //my/app برای ارجاع به یک بسته در مشخصات یک package_group یا در فایل‌های .bzl . تشویق می‌شود، زیرا به وضوح نشان می‌دهد که نام بسته مطلق است و در دایرکتوری سطح بالای فضای کاری ریشه دارد. .

برچسب های نسبی را نمی توان برای اشاره به اهداف در بسته های دیگر استفاده کرد. شناسه مخزن و نام بسته همیشه باید در این مورد مشخص شود. به عنوان مثال، اگر درخت منبع حاوی هر دو بسته my/app و بسته my/app/testdata (هر یک از این دو دایرکتوری فایل BUILD خود را دارند)، بسته دوم حاوی فایلی به نام testdepot.zip است. در اینجا دو راه (یکی اشتباه، یکی صحیح) برای مراجعه به این فایل در //my/app:BUILD وجود دارد:

اشتباه - testdata بسته متفاوتی است، بنابراین نمی‌توانید از یک مسیر نسبی استفاده کنید

testdata/testdepot.zip

صحیح - به داده testdata با مسیر کامل آن مراجعه کنید

//my/app/testdata:testdepot.zip

برچسب‌هایی که با @// شروع می‌شوند، ارجاعاتی به مخزن اصلی هستند که حتی از مخازن خارجی نیز کار می‌کنند. بنابراین @//a/b/c با //a/b/c زمانی که از یک مخزن خارجی ارجاع داده می شود متفاوت است. اولی به مخزن اصلی برمی گردد، در حالی که دومی //a/b/c را در خود مخزن خارجی جستجو می کند. این امر مخصوصاً هنگام نوشتن قوانین در مخزن اصلی که به اهداف موجود در مخزن اصلی اشاره می‌کنند مرتبط است و از مخازن خارجی استفاده خواهد شد.

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

مشخصات لغوی یک برچسب

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

جزئیات دقیق اسامی هدف مجاز در زیر آمده است.

نام‌های هدف - نام package-name :target-name

target-name نام هدف درون بسته است. نام یک قانون، مقدار ویژگی name در اعلان قانون در یک فایل BUILD است. نام یک فایل، نام مسیر آن نسبت به دایرکتوری حاوی فایل BUILD است.

نام‌های هدف باید کاملاً از کاراکترهایی تشکیل شده باشند که از مجموعه az ، AZ ، 09 ، و علامت‌های نقطه‌گذاری !%-@^_"#$&'()*-+,;<=>?[]{|}~/. .

نام فایل ها باید نام مسیرهای نسبی به شکل معمولی باشند، به این معنی که نه باید با یک اسلش شروع شوند و نه به پایان برسند (مثلاً /foo و foo/ ممنوع هستند) و یا حاوی چندین اسلش متوالی به عنوان جداکننده مسیر باشند (مثلا foo//bar ). به طور مشابه، مراجع سطح بالا ( .. ) و مراجع دایرکتوری فعلی ( ./ ) ممنوع هستند.

اشتباه - از «..» برای ارجاع به فایل های موجود در بسته های دیگر استفاده نکنید

درست - از «// package-name : filename » استفاده کنید

در حالی که استفاده از / در نام هدف فایل رایج است، از استفاده از / در نام قوانین اجتناب کنید. مخصوصاً زمانی که از شکل کوتاه یک برچسب استفاده می شود، ممکن است خواننده را سردرگم کند. برچسب //foo/bar/wiz همیشه مخفف //foo/bar/wiz:wiz است، حتی اگر چنین بسته ای وجود نداشته باشد foo/bar/wiz . هرگز به //foo:bar/wiz اشاره نمی کند، حتی اگر آن هدف وجود داشته باشد.

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

نام بسته - //package-name: target-name

نام یک بسته، نام دایرکتوری حاوی فایل BUILD آن، نسبت به دایرکتوری سطح بالای مخزن حاوی است. به عنوان مثال: my/app .

نام بسته‌ها باید کاملاً از نویسه‌هایی تشکیل 9 باشد که از مجموعه A - Z , a - z , 0 , ' / ', ' - ',' گرفته شده‌اند . '، ' @ '، و ' _ '، و نمی تواند با اسلش شروع شود.

برای زبانی با ساختار دایرکتوری که برای سیستم ماژول آن مهم است (به عنوان مثال جاوا)، انتخاب نام دایرکتوری‌هایی که شناسه‌های معتبر در زبان هستند، مهم است.

اگرچه Bazel از اهداف در بسته ریشه فضای کاری پشتیبانی می کند (به عنوان مثال، //:foo )، بهتر است آن بسته را خالی بگذارید تا همه بسته های معنی دار دارای نام های توصیفی باشند.

نام بسته‌ها ممکن است حاوی رشته فرعی // نباشد و با علامت اسلش ختم نشود.

قوانین

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

فایل های BUILD با احضار قوانین اهداف را اعلام می کنند.

در مثال زیر، اعلان هدف my_app را با استفاده از قانون cc_binary می کنیم.

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

هر فراخوانی قانون یک ویژگی name دارد (که باید یک نام هدف معتبر باشد)، که یک هدف را در بسته فایل BUILD اعلام می کند.

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

ویژگی srcs موجود در بسیاری از قوانین دارای نوع "list of labels" است. مقدار آن، در صورت وجود، فهرستی از برچسب ها است که هر کدام نام هدفی است که ورودی این قانون است.

در برخی موارد، نام نوع قانون تا حدودی دلخواه است و جالب تر، نام فایل های تولید شده توسط قانون است و این در مورد ژانرها صادق است. برای اطلاعات بیشتر، به قوانین عمومی مراجعه کنید: genrule .

در موارد دیگر، نام مهم است: به عنوان مثال، برای قوانین *_binary و *_test ، نام قانون، نام فایل اجرایی تولید شده توسط ساخت را تعیین می کند.

این گراف غیر چرخه ای جهت دار روی اهداف، گراف هدف یا گراف وابستگی ساخت نامیده می شود و دامنه ای است که ابزار پرس و جو Bazel بر روی آن کار می کند.

اهداف ساخت فایل