নিয়োজিত নিয়ম

এই পৃষ্ঠাটি নিয়ম লেখকদের জন্য যারা তাদের নিয়ম অন্যদের কাছে উপলব্ধ করার পরিকল্পনা করছেন৷

হোস্টিং এবং নামকরণের নিয়ম

নতুন নিয়ম আপনার প্রতিষ্ঠানের অধীনে তাদের নিজস্ব GitHub সংগ্রহস্থলে যেতে হবে। আপনি যদি মনে করেন যে আপনার নিয়মগুলি বেজেলবিল্ড সংস্থার অন্তর্গত আছে তবে bazel-dev মেলিং তালিকার সাথে যোগাযোগ করুন৷

Bazel নিয়মগুলির জন্য সংগ্রহস্থলের নামগুলি নিম্নলিখিত বিন্যাসে প্রমিত করা হয়েছে: $ORGANIZATION/rules_$NAMEGitHub এ উদাহরণ দেখুন। ধারাবাহিকতার জন্য, আপনার Bazel নিয়মগুলি প্রকাশ করার সময় আপনাকে অবশ্যই এই একই বিন্যাসটি অনুসরণ করতে হবে৷

একটি বর্ণনামূলক GitHub সংগ্রহস্থলের বিবরণ এবং README.md শিরোনাম ব্যবহার করা নিশ্চিত করুন, উদাহরণ:

  • সংগ্রহস্থলের নাম: bazelbuild/rules_go
  • সংগ্রহস্থল বিবরণ: Bazel জন্য নিয়ম যান
  • সংগ্রহস্থল ট্যাগ: golang , bazel
  • README.md শিরোনাম: বেজেলের জন্য নিয়মগুলি দেখুন (https://bazel.build-এর লিঙ্কটি নোট করুন যা ব্যাজেলের সাথে অপরিচিত ব্যবহারকারীদের সঠিক জায়গায় নিয়ে যাবে)

নিয়মগুলি ভাষা (যেমন স্কালা) বা প্ল্যাটফর্ম (যেমন 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 )। অনুগ্রহ করে bazel-dev মেইলিং তালিকার সাথে যোগাযোগ করুন যদি আপনি মনে করেন যে আপনার নিয়মগুলি বেজেলবিল্ড সংস্থার নিয়মগুলির জন্য কনভেনশন অনুসরণ করা উচিত৷

নিম্নলিখিত বিভাগগুলিতে, অনুমান করুন ভান্ডারটি bazelbuild সংস্থার অন্তর্গত৷

workspace(name = "rules_mockascript")

README

শীর্ষ স্তরে, একটি README থাকা উচিত যাতে (অন্তত) আপনার নিয়ম ব্যবহার করার জন্য ব্যবহারকারীদের তাদের WORKSPACE ফাইলে কপি-পেস্ট করতে হবে। সাধারণভাবে, এটি একটি http_archive হবে যা আপনার GitHub রিলিজের দিকে নির্দেশ করে এবং একটি ম্যাক্রো কল যা আপনার নিয়মের প্রয়োজনে যেকোনো সরঞ্জাম ডাউনলোড/কনফিগার করে। উদাহরণস্বরূপ, Go নিয়মগুলির জন্য, এটির মত দেখাচ্ছে:

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 ফাইলগুলিতে প্ল্যাটফর্ম নির্দিষ্ট যুক্তি সম্পাদন করতে তাদের ব্যবহার করবে (উদাহরণস্বরূপ, নির্বাচনগুলি ব্যবহার করে)। কাস্টম সীমাবদ্ধতার সাথে, আপনি একটি ভাষা সংজ্ঞায়িত করেন যেটি পুরো Bazel ইকোসিস্টেম কথা বলবে।

রানফাইলস লাইব্রেরি

যদি আপনার নিয়ম রানফাইলগুলি অ্যাক্সেস করার জন্য একটি স্ট্যান্ডার্ড লাইব্রেরি প্রদান করে, তাহলে এটি //<LANG>/runfiles ( //<LANG>/runfiles:runfiles এর একটি সংক্ষিপ্ত রূপ) এ অবস্থিত একটি লাইব্রেরি টার্গেট আকারে হওয়া উচিত। ব্যবহারকারীর লক্ষ্যমাত্রা যাদের তাদের ডেটা নির্ভরতা অ্যাক্সেস করতে হবে তারা সাধারণত তাদের deps অ্যাট্রিবিউটে এই লক্ষ্য যুক্ত করবে।

সংগ্রহস্থলের নিয়ম

নির্ভরতা

আপনার নিয়ম বহিরাগত নির্ভরতা থাকতে পারে. আপনার নিয়মের উপর নির্ভর করে সহজতর করতে, অনুগ্রহ করে একটি WORKSPACE ম্যাক্রো প্রদান করুন যা ঐ বাহ্যিক নির্ভরতার উপর নির্ভরতা ঘোষণা করবে। সেখানে পরীক্ষার নির্ভরতা ঘোষণা করবেন না, শুধুমাত্র সেই নির্ভরতাগুলি যা নিয়মগুলিকে কাজ করতে হবে। WORKSPACE ফাইলে উন্নয়ন নির্ভরতা রাখুন।

<LANG>/repositories.bzl নামে একটি ফাইল তৈরি করুন এবং rules_<LANG>_dependencies নামে একটি একক এন্ট্রি পয়েন্ট ম্যাক্রো প্রদান করুন। আমাদের ডিরেক্টরি নিম্নলিখিত হিসাবে দেখাবে:

/
  mockascript/
    constraints/
      BUILD
    BUILD
    defs.bzl
    repositories.bzl

টুলচেইন নিবন্ধন করা হচ্ছে

আপনার নিয়মগুলি টুলচেইন নিবন্ধন করতে পারে। অনুগ্রহ করে একটি পৃথক ওয়ার্কস্পেস ম্যাক্রো প্রদান করুন যা এই WORKSPACE নিবন্ধন করে৷ এইভাবে ব্যবহারকারীরা পূর্ববর্তী ম্যাক্রো বাদ দেওয়ার সিদ্ধান্ত নিতে পারে এবং ম্যানুয়ালি নির্ভরতা নিয়ন্ত্রণ করতে পারে, যদিও এখনও টুলচেন নিবন্ধন করার অনুমতি দেওয়া হচ্ছে।

তাই <LANG>/repositories.bzl ফাইলে rules_<LANG>_toolchains নামের একটি WORKSPACE ম্যাক্রো যোগ করুন।

নোট করুন যে বিশ্লেষণ পর্বে টুলচেইনগুলি সমাধান করার জন্য Bazel কে নিবন্ধিত সমস্ত 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.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 ডকুমেন্টেশন দেখুন যাতে ডকুমেন্টেশন স্বয়ংক্রিয়ভাবে তৈরি করা যায়।

FAQs

কেন আমরা মূল Bazel GitHub সংগ্রহস্থলে আমাদের নিয়ম যোগ করতে পারি না?

আমরা যতটা সম্ভব Bazel রিলিজ থেকে নিয়মগুলিকে দ্বিগুণ করতে চাই৷ ব্যাজেল ডেভেলপারদের উপর লোড কমিয়ে, কে স্বতন্ত্র নিয়মের মালিক তা স্পষ্ট। আমাদের ব্যবহারকারীদের জন্য, ডিকপলিং নিয়মগুলি সংশোধন, আপগ্রেড, ডাউনগ্রেড এবং প্রতিস্থাপন করা সহজ করে তোলে। নিয়মগুলিতে অবদান রাখা বাজেলে অবদান রাখার চেয়ে হালকা ওজনের হতে পারে - নিয়মগুলির উপর নির্ভর করে - সংশ্লিষ্ট GitHub সংগ্রহস্থলে সম্পূর্ণ জমা দেওয়ার অ্যাক্সেস সহ। Bazel-এ সাবমিট অ্যাক্সেস পাওয়া নিজেই অনেক বেশি জড়িত প্রক্রিয়া।

নেতিবাচক দিক হল আমাদের ব্যবহারকারীদের জন্য আরও জটিল এক-সময়ের ইনস্টলেশন প্রক্রিয়া: তাদের WORKSPACE ফাইলে একটি নিয়ম কপি-পেস্ট করতে হবে, যেমনটি উপরের README.md বিভাগে দেখানো হয়েছে।

আমাদের ব্যাজেল সংগ্রহস্থলে ( //tools/build_rules বা //tools/build_defs অধীনে) সমস্ত নিয়ম ছিল। আমরা এখনও সেখানে কিছু নিয়ম আছে, কিন্তু আমরা বাকি নিয়ম সরানোর জন্য কাজ করছি.