BazelCon 2022 16-17 নভেম্বর নিউ ইয়র্ক এবং অনলাইনে আসছে।
নিবন্ধন আজ!

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

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

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

সংজ্ঞা অনুসারে, প্রতিটি প্যাকেজে একটি 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 ফাইল দৃশ্যমান করার জন্য আপনাকে exports_files ব্যবহার করতে হবে না।

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

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

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