ফাইল তৈরি করুন

পূর্ববর্তী বিভাগগুলি প্যাকেজ, লক্ষ্য এবং লেবেল এবং বিল্ড নির্ভরতা গ্রাফ বিমূর্তভাবে বর্ণনা করেছে। এই বিভাগটি একটি প্যাকেজ সংজ্ঞায়িত করতে ব্যবহৃত কংক্রিট সিনট্যাক্স বর্ণনা করে।

সংজ্ঞা অনুসারে, প্রতিটি প্যাকেজে একটি BUILD ফাইল রয়েছে, যা একটি সংক্ষিপ্ত প্রোগ্রাম। BUILD ফাইলগুলি একটি অপরিহার্য ভাষা, Starlark ব্যবহার করে মূল্যায়ন করা হয়।

এগুলিকে বিবৃতিগুলির একটি ক্রমিক তালিকা হিসাবে ব্যাখ্যা করা হয়।

সাধারণভাবে, অর্ডার গুরুত্বপূর্ণ: ভেরিয়েবলগুলি ব্যবহার করার আগে অবশ্যই সংজ্ঞায়িত করা উচিত, উদাহরণস্বরূপ। যাইহোক, বেশিরভাগ BUILD ফাইলে শুধুমাত্র বিল্ড নিয়মের ঘোষণা থাকে, এবং এই বিবৃতিগুলির আপেক্ষিক ক্রম অমূলক; প্যাকেজ মূল্যায়ন শেষ হওয়ার সময় কোন নিয়মগুলি ঘোষণা করা হয়েছিল এবং কোন মানগুলির সাথে তা গুরুত্বপূর্ণ।

যখন একটি বিল্ড নিয়ম ফাংশন, যেমন cc_library , সম্পাদিত হয়, এটি গ্রাফে একটি নতুন লক্ষ্য তৈরি করে। এই লক্ষ্যটি পরে একটি লেবেল ব্যবহার করে উল্লেখ করা যেতে পারে।

সাধারণ BUILD ফাইলগুলিতে, নিয়মের ঘোষণাগুলি আচরণ পরিবর্তন না করে অবাধে পুনরায় অর্ডার করা যেতে পারে।

কোড এবং ডেটার মধ্যে একটি পরিষ্কার বিচ্ছেদকে উত্সাহিত করার জন্য, BUILD ফাইলগুলিতে বিবৃতি বা if বিবৃতিগুলির for ফাংশন সংজ্ঞা থাকতে পারে না (তবে বোঝার তালিকা এবং if অভিব্যক্তি অনুমোদিত হয়)। পরিবর্তে .bzl ফাইলে ফাংশন ঘোষণা করা যেতে পারে। উপরন্তু, BUILD ফাইলে *args এবং **kwargs আর্গুমেন্ট অনুমোদিত নয়; পরিবর্তে স্পষ্টভাবে সমস্ত আর্গুমেন্ট তালিকা.

গুরুত্বপূর্ণভাবে, স্টারলার্কের প্রোগ্রামগুলি নির্বিচারে I/O সম্পাদন করতে পারে না। এই অপরিবর্তনীয়টি BUILD ফাইলগুলির ব্যাখ্যাকে হারমেটিক করে তোলে — শুধুমাত্র একটি পরিচিত ইনপুটের সেটের উপর নির্ভর করে, যা বিল্ডগুলি পুনরুত্পাদনযোগ্য তা নিশ্চিত করার জন্য অপরিহার্য। আরো বিস্তারিত জানার জন্য, হারমেটিসিটি দেখুন।

BUILD ফাইলগুলি শুধুমাত্র ASCII অক্ষর ব্যবহার করে লেখা উচিত, যদিও প্রযুক্তিগতভাবে সেগুলি ল্যাটিন-1 অক্ষর সেট ব্যবহার করে ব্যাখ্যা করা হয়।

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

একটি এক্সটেনশন লোড হচ্ছে

Bazel এক্সটেনশন হল .bzl এ শেষ হওয়া ফাইল। একটি এক্সটেনশন থেকে একটি প্রতীক আমদানি করতে load বিবৃতি ব্যবহার করুন।

load("//foo/bar:file.bzl", "some_library")

এই কোডটি foo/bar/file.bzl ফাইল লোড করে এবং some_library চিহ্ন পরিবেশে যোগ করে। এটি নতুন নিয়ম, ফাংশন বা ধ্রুবক (উদাহরণস্বরূপ, একটি স্ট্রিং বা একটি তালিকা) লোড করতে ব্যবহার করা যেতে পারে। load করার জন্য কলে অতিরিক্ত আর্গুমেন্ট ব্যবহার করে একাধিক চিহ্ন আমদানি করা যেতে পারে। আর্গুমেন্টগুলি অবশ্যই স্ট্রিং লিটারেল হতে হবে (কোনও পরিবর্তনশীল নয়) এবং load স্টেটমেন্টগুলি অবশ্যই শীর্ষ-স্তরে উপস্থিত হতে হবে - তারা একটি ফাংশন বডিতে থাকতে পারে না।

load প্রথম যুক্তি হল একটি লেবেল যা একটি .bzl ফাইল সনাক্ত করে। যদি এটি একটি আপেক্ষিক লেবেল হয়, তবে বর্তমান bzl ফাইল ধারণকারী প্যাকেজ (ডিরেক্টরি নয়) এর সাথে এটি সমাধান করা হয়। load স্টেটমেন্টে আপেক্ষিক লেবেলে একটি লিডিং ব্যবহার করা উচিত :

load উপনামগুলিকেও সমর্থন করে, তাই, আপনি আমদানি করা প্রতীকগুলিতে বিভিন্ন নাম বরাদ্দ করতে পারেন।

load("//foo/bar:file.bzl", library_alias = "some_library")

আপনি একটি load স্টেটমেন্টের মধ্যে একাধিক উপনাম সংজ্ঞায়িত করতে পারেন। অধিকন্তু, আর্গুমেন্ট তালিকায় উপনাম এবং নিয়মিত চিহ্নের নাম উভয়ই থাকতে পারে। নিম্নলিখিত উদাহরণটি পুরোপুরি আইনী (অনুগ্রহ করে নোট করুন কখন উদ্ধৃতি চিহ্ন ব্যবহার করবেন)।

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

একটি .bzl ফাইলে, _ দিয়ে শুরু হওয়া চিহ্নগুলি এক্সপোর্ট করা হয় না এবং অন্য ফাইল থেকে লোড করা যায় না।

কে একটি .bzl ফাইল লোড করতে পারে তা সীমাবদ্ধ করতে আপনি লোড দৃশ্যমানতা ব্যবহার করতে পারেন।

নির্মাণ নিয়মের ধরন

বেশিরভাগ বিল্ড নিয়মগুলি পরিবারের মধ্যে আসে, ভাষা দ্বারা একত্রিত হয়। উদাহরণস্বরূপ, cc_binary , cc_library এবং cc_test হল যথাক্রমে C++ বাইনারি, লাইব্রেরি এবং পরীক্ষার জন্য বিল্ড নিয়ম। অন্যান্য ভাষা একই নামকরণ স্কিম ব্যবহার করে, একটি ভিন্ন উপসর্গ সহ, যেমন জাভা এর জন্য java_* । এর মধ্যে কিছু ফাংশন বিল্ড এনসাইক্লোপিডিয়াতে নথিভুক্ত করা হয়েছে, কিন্তু যে কারো পক্ষে নতুন নিয়ম তৈরি করা সম্ভব।

  • *_binary নিয়ম একটি প্রদত্ত ভাষায় এক্সিকিউটেবল প্রোগ্রাম তৈরি করে। একটি বিল্ড করার পরে, এক্সিকিউটেবলটি বিল্ড টুলের বাইনারি আউটপুট ট্রিতে থাকবে নিয়মের লেবেলের জন্য সংশ্লিষ্ট নামে, তাই //my:program (উদাহরণস্বরূপ) $(BINDIR)/my/program এ উপস্থিত হবে।

    কিছু ভাষায়, এই ধরনের নিয়মগুলি নিয়মের অন্তর্গত একটি data অ্যাট্রিবিউটে উল্লিখিত সমস্ত ফাইল সমন্বিত একটি রানফাইল ডিরেক্টরি তৈরি করে, বা এর নির্ভরতা বন্ধ করার ট্রানজিটিভ ক্লোজারের কোনো নিয়ম; এই সেট ফাইলগুলিকে এক জায়গায় একত্রিত করা হয় যাতে উৎপাদনে স্থাপনের সুবিধা হয়।

  • *_test নিয়মের একটি *_binary , যা স্বয়ংক্রিয় পরীক্ষার জন্য ব্যবহৃত হয়। পরীক্ষাগুলি হল এমন একটি প্রোগ্রাম যা সাফল্যে শূন্য দেয়।

    বাইনারিগুলির মতো, পরীক্ষাগুলিতেও রানফাইল ট্রি থাকে এবং এর নীচের ফাইলগুলিই একমাত্র ফাইল যা রানটাইমে একটি পরীক্ষা বৈধভাবে খুলতে পারে। উদাহরণস্বরূপ, একটি প্রোগ্রাম cc_test(name='x', data=['//foo:bar']) এক্সিকিউশনের সময় $TEST_SRCDIR/workspace/foo/bar খুলতে এবং পড়তে পারে। ( $TEST_SRCDIR এর মান অ্যাক্সেস করার জন্য প্রতিটি প্রোগ্রামিং ভাষার নিজস্ব ইউটিলিটি ফাংশন রয়েছে, কিন্তু সেগুলি সবই এনভায়রনমেন্ট ভেরিয়েবল সরাসরি ব্যবহার করার সমতুল্য।) নিয়ম পালন করতে ব্যর্থ হলে পরীক্ষাটি ব্যর্থ হবে যখন এটি একটি দূরবর্তী টেস্টিং হোস্টে কার্যকর করা হয়। .

  • *_library নিয়ম প্রদত্ত প্রোগ্রামিং ভাষায় পৃথকভাবে সংকলিত মডিউল নির্দিষ্ট করে। লাইব্রেরিগুলি অন্যান্য লাইব্রেরির উপর নির্ভর করতে পারে, এবং বাইনারি এবং পরীক্ষাগুলি প্রত্যাশিত পৃথক-সংকলন আচরণ সহ লাইব্রেরির উপর নির্ভর করতে পারে।

লেবেল নির্ভরতা