ভান্ডারের নিয়ম

এই পৃষ্ঠাটি কীভাবে সংগ্রহস্থলের নিয়ম তৈরি করতে হয় তা কভার করে এবং আরও বিশদ বিবরণের জন্য উদাহরণ প্রদান করে।

একটি বহিরাগত সংগ্রহস্থল হল একটি নিয়ম যা শুধুমাত্র ওয়ার্কস্পেস ফাইলে ব্যবহার করা যেতে পারে এবং WORKSPACE লোডিং পর্যায়ে নন-হারমেটিক অপারেশন সক্ষম করে। প্রতিটি বাহ্যিক সংগ্রহস্থলের নিয়ম তার নিজস্ব BUILD ফাইল এবং আর্টিফ্যাক্ট সহ নিজস্ব ওয়ার্কস্পেস তৈরি করে। এগুলি তৃতীয় পক্ষের লাইব্রেরির উপর নির্ভর করতে ব্যবহার করা যেতে পারে (যেমন মাভেন প্যাকেজড লাইব্রেরি) তবে হোস্ট বেজেল চালু থাকা নির্দিষ্ট BUILD ফাইল তৈরি করতেও।

সংগ্রহস্থল নিয়ম সৃষ্টি

একটি .bzl ফাইলে, একটি নতুন সংগ্রহস্থলের নিয়ম তৈরি করতে repository_rule ফাংশনটি ব্যবহার করুন এবং এটি একটি গ্লোবাল ভেরিয়েবলে সংরক্ষণ করুন।

একটি কাস্টম সংগ্রহস্থল নিয়ম ঠিক একটি নেটিভ রিপোজিটরি নিয়মের মতো ব্যবহার করা যেতে পারে। এটির একটি বাধ্যতামূলক name বৈশিষ্ট্য রয়েছে এবং এর বিল্ড ফাইলগুলিতে উপস্থিত প্রতিটি লক্ষ্যকে @<name>//package:target হিসাবে উল্লেখ করা যেতে পারে যেখানে <name> name বৈশিষ্ট্যের মান।

নিয়মটি লোড হয় যখন আপনি স্পষ্টভাবে এটি তৈরি করেন, বা এটি বিল্ডের নির্ভরতা হয়। এই ক্ষেত্রে, Bazel এর 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 s এর অন্তর্নিহিতভাবে সংজ্ঞায়িত বৈশিষ্ট্য রয়েছে (বিল্ড নিয়মের মতো)। দুটি অন্তর্নিহিত বৈশিষ্ট্য হল name (বিল্ড নিয়মের মতো) এবং repo_mapping । একটি সংগ্রহস্থলের নিয়মের নাম repository_ctx.name দিয়ে অ্যাক্সেসযোগ্য। repo_mapping এর অর্থ স্থানীয় সংগ্রহস্থলের নিয়ম স্থানীয়_রিপোজিটরি এবং local_repository এর new_local_repository

যদি একটি বৈশিষ্ট্যের নাম _ দিয়ে শুরু হয় তবে এটি ব্যক্তিগত এবং ব্যবহারকারীরা এটি সেট করতে পারবেন না।

বাস্তবায়ন ফাংশন

প্রতিটি সংগ্রহস্থল নিয়ম একটি implementation ফাংশন প্রয়োজন. এটিতে নিয়মের প্রকৃত যুক্তি রয়েছে এবং লোডিং পর্যায়ে কঠোরভাবে কার্যকর করা হয়।

ফাংশনের ঠিক একটি ইনপুট প্যারামিটার আছে, repository_ctx । ফাংশনটি হয় None প্রদান করে নির্দেশ করে যে নিয়মটি নির্দিষ্ট পরামিতিগুলির দ্বারা পুনরুত্পাদনযোগ্য, অথবা সেই নিয়মের জন্য প্যারামিটারগুলির একটি সেট সহ একটি নির্দেশ যা সেই নিয়মটিকে একটি পুনরুত্পাদনযোগ্য একটিতে পরিণত করবে যা একই সংগ্রহস্থল তৈরি করে। উদাহরণস্বরূপ, একটি গিট রিপোজিটরি ট্র্যাক করার নিয়মের জন্য যার অর্থ একটি ফ্লোটিং শাখার পরিবর্তে একটি নির্দিষ্ট কমিট শনাক্তকারী ফেরত দেওয়া যা মূলত নির্দিষ্ট করা হয়েছিল।

ইনপুট প্যারামিটার repository_ctx অ্যাট্রিবিউট মান, এবং নন-হার্মেটিক ফাংশন অ্যাক্সেস করতে ব্যবহার করা যেতে পারে (একটি বাইনারি সন্ধান করা, একটি বাইনারি চালানো, সংগ্রহস্থলে একটি ফাইল তৈরি করা বা ইন্টারনেট থেকে একটি ফাইল ডাউনলোড করা)। আরও প্রসঙ্গের জন্য লাইব্রেরি দেখুন। উদাহরণ:

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

বাস্তবায়ন ফাংশন কখন কার্যকর করা হয়?

যদি সংগ্রহস্থলটিকে local হিসাবে ঘোষণা করা হয় তবে নির্ভরতা গ্রাফে একটি নির্ভরতার পরিবর্তন ( WORKSPACE ফাইল নিজেই সহ) বাস্তবায়ন ফাংশনটি কার্যকর করবে।

ইমপ্লিমেন্টেশন ফাংশন রিস্টার্ট করা যেতে পারে যদি কোনো ডিপেনডেন্সি অনুপস্থিত থাকে। নির্ভরতা সমাধানের পরে বাস্তবায়ন ফাংশনের শুরুটি পুনরায় কার্যকর করা হবে। অপ্রয়োজনীয় পুনঃসূচনা এড়াতে (যা ব্যয়বহুল, কারণ নেটওয়ার্ক অ্যাক্সেস পুনরাবৃত্তি করতে হতে পারে), লেবেল আর্গুমেন্টগুলি প্রিফেচ করা হয়, যদি সমস্ত লেবেল আর্গুমেন্ট একটি বিদ্যমান ফাইলে সমাধান করা যায়। মনে রাখবেন যে একটি স্ট্রিং বা একটি লেবেল থেকে একটি পাথ সমাধান করা যা শুধুমাত্র ফাংশনটি কার্যকর করার সময় তৈরি করা হয়েছিল তা এখনও পুনরায় চালু হতে পারে।

অবশেষে, অ- local সংগ্রহস্থলগুলির জন্য, শুধুমাত্র নিম্নলিখিত নির্ভরতাগুলির একটি পরিবর্তন পুনরায় চালু করতে পারে:

  • .bzl ফাইল সংগ্রহস্থল নিয়ম সংজ্ঞায়িত করতে প্রয়োজন.
  • WORKSPACE ফাইলে সংগ্রহস্থলের নিয়মের ঘোষণা।
  • repository_rule ফাংশনের environ অ্যাট্রিবিউটের সাথে ঘোষিত যেকোন এনভায়রনমেন্ট ভেরিয়েবলের মান। এই এনভায়রনমেন্ট ভেরিয়েবলের মান --action_env পতাকা দিয়ে কমান্ড লাইন থেকে প্রয়োগ করা যেতে পারে (কিন্তু এই পতাকাটি বিল্ডের প্রতিটি ক্রিয়াকে বাতিল করে দেবে)।
  • লেবেল দ্বারা ব্যবহৃত এবং উল্লেখ করা যেকোনো ফাইলের বিষয়বস্তু (উদাহরণস্বরূপ, //mypkg:label.txt mypkg/label.txt নয়)।

বাহ্যিক সংগ্রহস্থলের রিফ্যাচ জোর করে

কখনও কখনও, একটি বহিরাগত সংগ্রহস্থল তার সংজ্ঞা বা নির্ভরতা পরিবর্তন ছাড়াই পুরানো হয়ে যেতে পারে। উদাহরণস্বরূপ, একটি সংগ্রহস্থল আনার উত্স একটি তৃতীয় পক্ষের সংগ্রহস্থলের একটি নির্দিষ্ট শাখা অনুসরণ করতে পারে এবং সেই শাখায় নতুন প্রতিশ্রুতি পাওয়া যায়। এই ক্ষেত্রে, আপনি bazel sync কল করে নিঃশর্তভাবে সমস্ত বাহ্যিক সংগ্রহস্থলগুলিকে ফেরত দিতে বলতে পারেন৷

তাছাড়া, কিছু নিয়ম স্থানীয় মেশিন পরিদর্শন করে এবং স্থানীয় মেশিন আপগ্রেড করা হলে পুরানো হয়ে যেতে পারে। এখানে আপনি bazel কে শুধুমাত্র সেই বাহ্যিক রিপোজিটরিগুলি রিফেচ করতে বলতে পারেন যেখানে repository_rule সংজ্ঞা configure অ্যাট্রিবিউট সেট আছে, bazel sync --configure ব্যবহার করুন।

উদাহরণ

  • C++ স্বয়ংক্রিয়-কনফিগার করা টুলচেন : এটি স্থানীয় C++ কম্পাইলার, পরিবেশ এবং C++ কম্পাইলার সমর্থন করে এমন ফ্ল্যাগ খোঁজার মাধ্যমে Bazel-এর জন্য স্বয়ংক্রিয়ভাবে C++ কনফিগারেশন ফাইল তৈরি করতে একটি সংগ্রহস্থলের নিয়ম ব্যবহার করে।

  • Go রিপোজিটরিগুলি Go নিয়মগুলি ব্যবহার করার জন্য প্রয়োজনীয় নির্ভরতার তালিকা নির্ধারণ করতে বেশ কয়েকটি repository_rule ব্যবহার করে।

  • Rules_jvm_external ডিফল্টরূপে @maven নামে একটি বাহ্যিক সংগ্রহস্থল তৈরি করে যা ট্রানজিটিভ ডিপেন্ডেন্সি ট্রিতে প্রতিটি Maven আর্টিফ্যাক্টের জন্য বিল্ড টার্গেট তৈরি করে।