هذه الصفحة مخصّصة لكتّاب القواعد الذين يخطّطون لتوفير قواعدهم للآخرين.
قواعد الاستضافة والتسمية
يجب نقل القواعد الجديدة إلى مستودع GitHub الخاص بهم ضمن مؤسستك. يُرجى التواصل مع القائمة البريدية لـbazel-dev في حال اعتقادك بأنّ قواعدك تنتمي إلى مؤسسة bazelbuild.
يتم توحيد أسماء المستودعات في Bazel بالتنسيق التالي:
$ORGANIZATION/rules_$NAME
.
اطّلِع على أمثلة على GitHub.
للحفاظ على الاتساق، يجب أن تتّبع التنسيق نفسه عند نشر قواعد Bazel.
تأكّد من استخدام وصف مستودع GitHub ووصف README.md
العنوان، على سبيل المثال:
- اسم المستودع:
bazelbuild/rules_go
- وصف المستودع: قواعد Go to Bazel
- علامتا المستودع:
golang
،bazel
README.md
العنوان: الانتقال إلى قواعد Bazel (يُرجى ملاحظة الرابط المؤدي إلى https://bazel.build الذي سيوجّه المستخدمين غير المعتادين إلى Bazel إلى المكان المناسب)
يمكن تجميع القواعد حسب اللغة (مثل Scala) أو المنصة (مثل Android).
محتوى المستودع
يجب أن يكون لكل مستودع قواعد تنسيق محدّد حتى يتمكّن المستخدمون من فهم القواعد الجديدة بسرعة.
على سبيل المثال، عند كتابة قواعد جديدة للغة (تصوّر)mockascript
، سيكون مستودع القواعد البنية التالية:
/
LICENSE
README
WORKSPACE
mockascript/
constraints/
BUILD
runfiles/
BUILD
runfiles.mocs
BUILD
defs.bzl
tests/
BUILD
some_test.sh
another_test.py
examples/
BUILD
bin.mocs
lib.mocs
test.mocs
مساحة العمل
في مشروع WORKSPACE
، يجب تحديد الاسم الذي سيستخدمه المستخدمون للإشارة إلى قواعدك. إذا كانت قواعدك تنتمي إلى
مؤسسة bazelbuild، عليك استخدام
rules_<lang>
(مثل rules_mockascript
). عليك بدلاً من ذلك تسمية
مستودعك <org>_rules_<lang>
(مثل build_stack_rules_proto
). يُرجى التواصل مع
القائمة البريدية Babzel-dev
إذا كنت تعتقد أنّ القواعد يجب أن تتّبع اتفاقية القواعد في مؤسسة
bazelbuild.
في الأقسام التالية، افترض أنّ المستودع ينتمي إلى مؤسسة bazelbuild.
workspace(name = "rules_mockascript")
ملف README
في المستوى الأعلى، يجب أن يكون هناك README
يحتوي على (على الأقل) ما يحتاج المستخدمون إلى نسخه ولصقه في ملف WORKSPACE
لاستخدام قاعدتك.
وبشكل عام، سيكون هذا عبارة عن http_archive
يشير إلى إصدار GitHub و
مكالمة ماكرو تعمل على تنزيل/ضبط أي أدوات تحتاج إليها قاعدتك. على سبيل المثال، بالنسبة إلى قواعد الانتقال، يبدو ذلك على النحو التالي:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_go",
urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz"],
sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329",
)
load("@rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
go_rules_dependencies()
go_register_toolchains()
إذا كانت قواعدك تعتمد على قواعد مستودع أخرى، يُرجى تحديد ذلك في مستندات "القواعد" (على سبيل المثال، راجِع قواعد Skydoc التي تعتمد على قواعد Sass)، وقدِّم ماكرو WORKSPACE
ليتم تنزيل جميع التبعيات (يُرجى الاطّلاع على rules_go
أعلاه).
القواعد
وغالبًا ما تكون هناك قواعد متعددة توفّرها مستودعك. إنشاء دليل يحمل اسم اللغة وتوفير نقطة إدخال - ملف defs.bzl
تصدير جميع القواعد (عليك أيضًا تضمين ملف BUILD
بحيث يكون الدليل حزمة).
بالنسبة إلى rules_mockascript
هذا يعني أنه سيكون هناك دليل باسم
mockascript
، وملف BUILD
وملف defs.bzl
في:
/
mockascript/
BUILD
defs.bzl
القيود
إذا كانت القاعدة تحدّد قواعد سلسلة الأدوات،
من الممكن أن تحتاج إلى تحديد constraint_setting
و/أو
constraint_value
مخصّصة. يمكنك وضع هذه الحزم في حزمة //<LANG>/constraints
. ستبدو بنية الدليل على النحو التالي:
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
يُرجى الاطّلاع على
github.com/bazelbuild/platforms
للحصول على أفضل الممارسات ومعرفة القيود الموجودة مسبقًا،
ويمكنك مراعاة القيود المفروضة عليها إذا كانت مستقلة عن اللغة.
احرِص على مراعاة القيود المخصّصة، حيث سيستخدمها جميع مستخدمي القواعد الخاصة بك لتنفيذ منطق خاص بمنصة في ملفات BUILD
(على سبيل المثال، باستخدام selects).
بقيود مخصّصة، يمكنك تحديد اللغة التي سيتحدث بها منظومة Bazel المتكاملة.
مكتبة الملفات
إذا كانت القاعدة توفّر مكتبة عادية للوصول إلى ملفات run، يجب أن تكون على شكل هدف مكتبة يقع على //<LANG>/runfiles
(اختصار
//<LANG>/runfiles:runfiles
). تضيف أهداف المستخدم التي تحتاج إلى الوصول إلى البيانات التابعة لها عادةً هذه السمة إلى السمة deps
.
قواعد المستودع
المهام التابعة
قد تحتوي قواعدك على تبعيات خارجية. لتبسيط قواعدك،
يُرجى تقديم وحدة ماكرو WORKSPACE
تُعلِن عن تبعيات تلك العناصر التابعة الخارجية. لا تعلن عن اعتماديات الاختبارات هناك، بل الاعتمادات فقط التي تتطلبها القواعد. أضِف تبعيات التطوير في ملف WORKSPACE
.
أنشئ ملفًا باسم <LANG>/repositories.bzl
وقدّم وحدة ماكرو واحدة لإدخاله باسم rules_<LANG>_dependencies
. سيظهر الدليل على النحو التالي:
/
mockascript/
constraints/
BUILD
BUILD
defs.bzl
repositories.bzl
تسجيل سلاسل الأدوات
وقد تسجّل القواعد أيضًا سلاسل الأدوات. يُرجى توفير ماكرو WORKSPACE
منفصل يسجّل سلاسل الأدوات هذه. بهذه الطريقة، يمكن للمستخدمين اختيار حذف وحدة الماكرو السابقة والتحكّم فيها يدويًا، مع السماح لهم بتسجيل سلاسل الأدوات.
وبالتالي، يمكنك إضافة وحدة ماكرو WORKSPACE
باسم rules_<LANG>_toolchains
إلى
ملف <LANG>/repositories.bzl
.
تجدر الإشارة إلى أنّه من أجل حلّ سلاسل الأدوات في مرحلة التحليل، عليك تحليل
كل أهداف toolchain
المسجّلة. لن يحتاج Bazel إلى تحليل كل الاستهدافات التي تشير إليها السمة toolchain.toolchain
. إذا كنت تريد تسجيل سلاسل الأدوات، عليك إجراء عملية حسابية معقدة في المستودع، يمكنك تقسيم المستودع باستخدام استهدافات toolchain
من المستودع باستخدام استهدافات <LANG>_toolchain
. سيتم استرجاع الطريقة السابقة دائمًا،
وسيتم استرجاع الطريقة السابقة فقط عندما يحتاج المستخدم إلى إنشاء رمز <LANG>
.
مقتطف الإصدار
في إعلان إصدار التطبيق، أضِف مقتطفًا يمكن للمستخدمين نسخه ولصقه في ملف WORKSPACE
. سيظهر هذا المقتطف بشكل عام على النحو التالي:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "rules_<LANG>",
urls = ["<url_to_the_release.zip"],
sha256 = "4242424242",
)
load("@rules_<LANG>//<LANG>:repositories.bzl", "rules_<LANG>_dependencies", "rules_<LANG>_toolchains")
rules_<LANG>_dependencies()
rules_<LANG>_toolchains()
الفحوصات
من المفترض أن يتم إجراء اختبارات تُثبت أن القواعد تعمل بشكلٍ سليم. ويمكن أن يكون هذا في الموقع العادي للغة التي يتم تطبيق القواعد عليها أو في دليل tests/
على المستوى الأعلى.
أمثلة (اختياري)
من المفيد أن يكون لدى المستخدمين دليل examples/
يعرض للمستخدمين بعض الطرق الأساسية التي يمكن من خلالها استخدام القواعد.
الاختبار
يمكنك إعداد Travis كما هو موضّح في مستندات البدء. أضِف بعد ذلك ملف
.travis.yml
إلى مستودعك يتضمّن المحتوى التالي:
dist: xenial # Ubuntu 16.04
# On trusty (or later) images, the Bazel apt repository can be used.
addons:
apt:
sources:
- sourceline: 'deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8'
key_url: 'https://bazel.build/bazel-release.pub.gpg'
packages:
- bazel
script:
- bazel build //...
- bazel test //...
إذا كان مستودعك ضمن مؤسسة bazelbuild، يمكنك طلب إضافته إلى ci.bazel.build.
المستندات
يمكنك الاطّلاع على مستندات Stardoc للحصول على تعليمات حول كيفية التعليق على القواعد حتى يمكن إنشاء المستندات تلقائيًا.
الأسئلة الشائعة
لماذا لا يمكننا إضافة قاعدتنا إلى مستودع Bazel GitHub الرئيسي؟
نريد فصل القواعد عن إصدارات Bazel قدر الإمكان. بات من الواضح أنّه يمتلك قواعد فردية، ما يقلل من أعباء مطوري Bazel. بالنسبة إلى المستخدمين، يمكن تسهيل تعديل القواعد وترقيتها والرجوع إلى إصدار سابق منها واستبدالها. قد يكون المساهمة في القواعد أقل أهمية من المساهمة في Bazel، وذلك استنادًا إلى القواعد، بما في ذلك إمكانية الوصول الكامل إلى مستودع GitHub المناسب. يُعدّ إرسال إذن الوصول إلى Bazel نفسه عملية أكثر تعقيدًا.
ويتمثل الجانب السلبي في عملية تثبيت أكثر تعقيدًا لمرة واحدة بالنسبة إلى المستخدمين:
يجب عليهم نسخ قاعدة ولصقها في ملف WORKSPACE
، كما هو موضّح في
قسم README.md
أعلاه.
اعتادنا أن نطبِّق جميع القواعد في مستودع Bazel (ضمن
//tools/build_rules
أو //tools/build_defs
)، ولا يزال لدينا قاعدتان، ولكننا نعمل على استبعاد القواعد المتبقية.