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

দৃশ্যমানতা

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

এই পৃষ্ঠাটি দৃশ্যমানতার বৈশিষ্ট্য, সর্বোত্তম অনুশীলন এবং উদাহরণগুলি কভার করে৷

দৃশ্যমানতা নিয়ন্ত্রণ করে অন্য প্যাকেজে লক্ষ্যমাত্রা দ্বারা একটি লক্ষ্য ব্যবহার করা যেতে পারে (নির্ভর করে)। এটি অন্যান্য লোকেদের আপনার লাইব্রেরির সর্বজনীন API এবং এর বাস্তবায়নের বিবরণের মধ্যে পার্থক্য করতে সহায়তা করে এবং আপনার কর্মক্ষেত্র বৃদ্ধির সাথে সাথে কাঠামো কার্যকর করতে সহায়তা করার জন্য এটি একটি গুরুত্বপূর্ণ হাতিয়ার৷

আপনি যদি দৃশ্যমানতা পরীক্ষা নিষ্ক্রিয় করতে চান (উদাহরণস্বরূপ পরীক্ষা করার সময়), --check_visibility=false ব্যবহার করুন।

প্যাকেজ এবং সাবপ্যাকেজ সম্পর্কে আরও বিশদ বিবরণের জন্য, ধারণা এবং পরিভাষা দেখুন।

দৃশ্যমানতার স্পেসিফিকেশন

সমস্ত নিয়ম লক্ষ্যে একটি visibility বৈশিষ্ট্য রয়েছে যা লেবেলের একটি তালিকা নেয়। একটি টার্গেট অন্যের কাছে দৃশ্যমান হয় যদি তারা একই প্যাকেজে থাকে, অথবা যদি সেগুলিকে একটি লেবেল দ্বারা দৃশ্যমানতা দেওয়া হয়।

প্রতিটি লেবেলের নিম্নলিখিত ফর্মগুলির মধ্যে একটি রয়েছে:

  • "//visibility:public" : যে কেউ এই টার্গেট ব্যবহার করতে পারে। (অন্য কোনো স্পেসিফিকেশনের সাথে একত্রিত করা যাবে না।)

  • "//visibility:private" : শুধুমাত্র এই প্যাকেজের টার্গেট এই টার্গেট ব্যবহার করতে পারে। (অন্য কোনো স্পেসিফিকেশনের সাথে একত্রিত করা যাবে না।)

  • "//foo/bar:__pkg__" : //foo/bar এ সংজ্ঞায়িত লক্ষ্যগুলিতে অ্যাক্সেস মঞ্জুর করে (কিন্তু এর সাবপ্যাকেজ নয়)। এখানে, __pkg__ একটি প্যাকেজের সমস্ত লক্ষ্যগুলিকে প্রতিনিধিত্ব করে সিনট্যাক্সের একটি বিশেষ অংশ।

  • "//foo/bar:__subpackages__" : //foo/bar , বা এর যেকোনো প্রত্যক্ষ বা পরোক্ষ সাবপ্যাকেজে সংজ্ঞায়িত লক্ষ্যগুলিতে অ্যাক্সেস মঞ্জুর করে। আবার, __subpackages__ বিশেষ সিনট্যাক্স।

  • "//foo/bar:my_package_group" : প্রদত্ত প্যাকেজ গোষ্ঠীর নাম দেওয়া সমস্ত প্যাকেজে অ্যাক্সেস মঞ্জুর করে।

    • প্যাকেজ গ্রুপ বিশেষ __pkg__ এবং __subpackages__ বাক্য গঠন সমর্থন করে না। একটি প্যাকেজ গ্রুপের মধ্যে, "//foo/bar" "//foo/bar:__pkg__" এর সমতুল্য এবং "//foo/bar/..." হল " "//foo/bar:__subpackages__" foo/bar:__subpackages__" এর সমতুল্য।

উদাহরণস্বরূপ, যদি //some/package:mytarget এর visibility [":__subpackages__", "//tests:__pkg__"] সেট করা থাকে, তাহলে এটি //some/package/... -এর অংশ এমন যেকোনো লক্ষ্য দ্বারা ব্যবহার করা যেতে পারে। //some/package/... উত্স ট্রি, সেইসাথে লক্ষ্যগুলি //tests/BUILD এ সংজ্ঞায়িত করা হয়েছে, কিন্তু //tests/integration/BUILD এ সংজ্ঞায়িত লক্ষ্য দ্বারা নয়।

একটি বিশেষ ক্ষেত্রে, package_group টার্গেটের নিজেরাই একটি visibility বৈশিষ্ট্য নেই; তারা সর্বদা সর্বজনীনভাবে দৃশ্যমান হয়।

দৃশ্যমানতা নির্দিষ্ট নন-প্যাকেজ_গ্রুপ লক্ষ্যে সেট করা যাবে না। এটি একটি "লেবেল একটি প্যাকেজ গ্রুপকে উল্লেখ করে না" বা "নির্ভরতা গ্রাফে চক্র" ত্রুটি ট্রিগার করে।

একটি নিয়ম লক্ষ্যের দৃশ্যমানতা

যদি একটি নিয়ম লক্ষ্য visibility বৈশিষ্ট্য সেট না করে, তাহলে এর দৃশ্যমানতা default_visibility দ্বারা দেওয়া হয় যা লক্ষ্যের BUILD ফাইলের package বিবৃতিতে উল্লেখ করা হয়েছিল। যদি এই ধরনের কোনো default_visibility ঘোষণা না থাকে, তাহলে দৃশ্যমানতা //visibility:private হয়।

config_setting দৃশ্যমানতা ঐতিহাসিকভাবে প্রয়োগ করা হয়নি। --incompatible_enforce_config_setting_visibility এবং --incompatible_config_setting_private_default_visibility অন্যান্য নিয়মের সাথে একত্রিত হওয়ার জন্য মাইগ্রেশন লজিক প্রদান করে।

যদি --incompatible_enforce_config_setting_visibility=false , প্রতিটি config_setting শর্তহীনভাবে সকল টার্গেটের কাছে দৃশ্যমান।

অন্যথায় যদি --incompatible_config_setting_private_default_visibility=false , যে কোনো config_setting যা স্পষ্টভাবে দৃশ্যমানতা সেট করে না তা হল //visibility:public (প্যাকেজ default_visibility উপেক্ষা করা)।

অন্যথায় যদি --incompatible_config_setting_private_default_visibility=true , config_setting অন্যান্য সমস্ত নিয়মের মতো একই দৃশ্যমানতা যুক্তি ব্যবহার করে।

সর্বোত্তম অনুশীলন হল সমস্ত config_setting লক্ষ্যগুলিকে অন্যান্য নিয়মের মতো আচরণ করা: প্যাকেজের বাইরে কোথাও ব্যবহৃত যে কোনও config_setting এ স্পষ্টভাবে visibility সেট করুন।

উদাহরণ

ফাইল //frobber/bin/BUILD :

# This target is visible to everyone
cc_binary(
    name = "executable",
    visibility = ["//visibility:public"],
    deps = [":library"],
)

# This target is visible only to targets declared in the same package
cc_library(
    name = "library",
    # No visibility -- defaults to private since no
    # package(default_visibility = ...) was used.
)

# This target is visible to targets in package //object and //noun
cc_library(
    name = "subject",
    visibility = [
        "//noun:__pkg__",
        "//object:__pkg__",
    ],
)

# See package group "//frobber:friends" (below) for who can
# access this target.
cc_library(
    name = "thingy",
    visibility = ["//frobber:friends"],
)

ফাইল //frobber/BUILD :

# This is the package group declaration to which target
# //frobber/bin:thingy refers.
#
# Our friends are packages //frobber, //fribber and any
# subpackage of //fribber.
package_group(
    name = "friends",
    packages = [
        "//fribber/...",
        "//frobber",
    ],
)

একটি জেনারেট করা ফাইল টার্গেটের দৃশ্যমানতা

একটি জেনারেট করা ফাইল টার্গেটের রুল টার্গেটের মতোই দৃশ্যমানতা রয়েছে যা এটি তৈরি করে।

একটি উৎস ফাইল লক্ষ্য দৃশ্যমানতা

ডিফল্টরূপে, সোর্স ফাইল টার্গেট শুধুমাত্র একই প্যাকেজ থেকে দৃশ্যমান হয়। অন্য প্যাকেজ থেকে একটি উৎস ফাইল অ্যাক্সেসযোগ্য করতে, exports_files ব্যবহার করুন।

exports_files -এ কল যদি দৃশ্যমানতার বৈশিষ্ট্য নির্দিষ্ট করে, তাহলে সেই দৃশ্যমানতা প্রযোজ্য। অন্যথায়, ফাইলটি সর্বজনীন ( default_visibility উপেক্ষা করা হয়)।

যখন সম্ভব, একটি উৎস ফাইলের পরিবর্তে একটি লাইব্রেরি বা অন্য ধরনের নিয়ম প্রকাশ করা পছন্দ করুন৷ উদাহরণস্বরূপ, একটি .java ফাইল এক্সপোর্ট করার পরিবর্তে একটি java_library ঘোষণা করুন। নিয়ম টার্গেটের জন্য শুধুমাত্র সরাসরি তার নিজস্ব প্যাকেজে উত্সগুলি অন্তর্ভুক্ত করা ভাল ফর্ম।

উদাহরণ

ফাইল //frobber/data/BUILD :

exports_files(["readme.txt"])

ফাইল //frobber/bin/BUILD :

cc_binary(
  name = "my-program",
  data = ["//frobber/data:readme.txt"],
)

উত্তরাধিকার আচরণ

যদি ফ্ল্যাগ --incompatible_no_implicit_file_export সেট করা না থাকে, তাহলে একটি উত্তরাধিকার আচরণ প্রযোজ্য হবে।

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

bzl ফাইলের দৃশ্যমানতা

load স্টেটমেন্ট বর্তমানে দৃশ্যমানতার বিষয় নয়। কর্মক্ষেত্রে যে কোন জায়গায় একটি bzl ফাইল লোড করা সম্ভব।

যাইহোক, ব্যবহারকারীরা বিল্ডিফায়ার লিন্টার চালানো বেছে নিতে পারেন। ব্যবহারকারীরা internal বা private নামে একটি সাবডিরেক্টরির নীচে থেকে load করলে bzl-দৃশ্যমানতা পরীক্ষা একটি সতর্কতা প্রদান করে।

অন্তর্নিহিত নির্ভরতার দৃশ্যমানতা

কিছু নিয়ম অন্তর্নিহিত নির্ভরতা আছে. উদাহরণস্বরূপ, একটি C++ নিয়ম অন্তর্নিহিতভাবে একটি C++ কম্পাইলারের উপর নির্ভর করতে পারে।

বর্তমানে, অন্তর্নিহিত নির্ভরতাগুলিকে স্বাভাবিক নির্ভরতার মতো বিবেচনা করা হয়। তাদের নিয়মের সমস্ত দৃষ্টান্ত দ্বারা দৃশ্যমান হওয়া দরকার। এই আচরণটি --incompatible_visibility_private_attributes_at_definition ব্যবহার করে পরিবর্তন করা যেতে পারে।

সেরা অনুশীলন

  • সর্বজনীনের জন্য ডিফল্ট দৃশ্যমানতা সেট করা এড়িয়ে চলুন। এটি প্রোটোটাইপিং বা ছোট কোডবেসের জন্য সুবিধাজনক হতে পারে, তবে এটি বড় কোডবেসে নিরুৎসাহিত করা হয়: কোন লক্ষ্যগুলি পাবলিক ইন্টারফেসের অংশ সে সম্পর্কে স্পষ্ট হওয়ার চেষ্টা করুন।

  • একাধিক টার্গেটের মধ্যে দৃশ্যমানতার স্পেসিফিকেশন শেয়ার করতে package_group ব্যবহার করুন। এটি বিশেষভাবে উপযোগী যখন অনেক BUILD ফাইলের লক্ষ্যগুলি একই প্যাকেজের সেটে উন্মুক্ত করা উচিত।

  • একটি লক্ষ্য অবমূল্যায়ন করার সময় সূক্ষ্ম-দানাযুক্ত দৃশ্যমানতার বৈশিষ্ট্য ব্যবহার করুন। নতুন নির্ভরতা এড়াতে বর্তমান ব্যবহারকারীদের কাছে দৃশ্যমানতা সীমাবদ্ধ করুন।