কনফিগারযোগ্য প্রশ্ন (cquery)

cquery হল query একটি রূপ যা বিল্ড গ্রাফে Select select()

এটি Bazel এর বিশ্লেষণ পর্বের ফলাফলের উপর চালানোর মাধ্যমে এটি অর্জন করে, যা এই প্রভাবগুলিকে একীভূত করে। query , বিপরীতে, Bazel এর লোডিং পর্যায়ের ফলাফলের উপর চলে, বিকল্পগুলি মূল্যায়ন করার আগে।

উদাহরণ স্বরূপ:

$ cat > tree/BUILD <<EOF
sh_library(
    name = "ash",
    deps = select({
        ":excelsior": [":manna-ash"],
        ":americana": [":white-ash"],
        "//conditions:default": [":common-ash"],
    }),
)
sh_library(name = "manna-ash")
sh_library(name = "white-ash")
sh_library(name = "common-ash")
config_setting(
    name = "excelsior",
    values = {"define": "species=excelsior"},
)
config_setting(
    name = "americana",
    values = {"define": "species=americana"},
)
EOF
# Traditional query: query doesn't know which select() branch you will choose,
# so it conservatively lists all of possible choices, including all used config_settings.
$ bazel query "deps(//tree:ash)" --noimplicit_deps
//tree:americana
//tree:ash
//tree:common-ash
//tree:excelsior
//tree:manna-ash
//tree:white-ash

# cquery: cquery lets you set build options at the command line and chooses
# the exact dependencies that implies (and also the config_setting targets).
$ bazel cquery "deps(//tree:ash)" --define species=excelsior --noimplicit_deps
//tree:ash (9f87702)
//tree:manna-ash (9f87702)
//tree:americana (9f87702)
//tree:excelsior (9f87702)

প্রতিটি ফলাফলে একটি অনন্য শনাক্তকারী (9f87702) কনফিগারেশন অন্তর্ভুক্ত থাকে যার সাথে লক্ষ্যটি তৈরি করা হয়েছে।

যেহেতু cquery কনফিগার করা লক্ষ্য গ্রাফের উপরে চলে। এটির বিল্ড অ্যাকশন বা [test_suite](/reference/be/general#test_suite) নিয়মগুলির অ্যাক্সেসের মতো আর্টিফ্যাক্টগুলির অন্তর্দৃষ্টি নেই কারণ সেগুলি কনফিগার করা লক্ষ্য নয়৷ পূর্বের জন্য, [aquery](/docs/aquery)

মৌলিক সিনট্যাক্স

একটি সাধারণ cquery কল এর মত দেখাচ্ছে:

bazel cquery "function(//target)"

ক্যোয়ারী এক্সপ্রেশন "function(//target)" নিম্নলিখিতগুলি নিয়ে গঠিত:

  • function(...) হল টার্গেটে চালানোর ফাংশন। cquery query এর বেশিরভাগ ফাংশন সমর্থন করে, সাথে কয়েকটি নতুন।
  • //target হল ফাংশনে দেওয়া এক্সপ্রেশন। এই উদাহরণে, অভিব্যক্তিটি একটি সহজ লক্ষ্য। কিন্তু ক্যোয়ারী ল্যাঙ্গুয়েজ ফাংশন নেস্ট করার অনুমতি দেয়। উদাহরণের জন্য কিভাবে- করুন প্রশ্ন দেখুন।

লোডিং এবং বিশ্লেষণ পর্যায়গুলির মধ্য দিয়ে চালানোর জন্য cquery এর একটি লক্ষ্য প্রয়োজন। অন্যথায় নির্দিষ্ট করা না থাকলে, cquery ক্যোয়ারী এক্সপ্রেশনে তালিকাভুক্ত লক্ষ্য(গুলি) পার্স করে। শীর্ষ-স্তরের বিল্ড লক্ষ্যগুলির নির্ভরতা অনুসন্ধানের জন্য --universe_scope দেখুন।

কনফিগারেশন

লাইন:

//tree:ash (9f87702)

মানে //tree:ash আইডি 9f87702 সহ একটি কনফিগারেশনে তৈরি করা হয়েছিল। বেশিরভাগ লক্ষ্যের জন্য, এটি কনফিগারেশন সংজ্ঞায়িত করে বিল্ড বিকল্পের মানগুলির একটি অস্বচ্ছ হ্যাশ।

কনফিগারেশনের সম্পূর্ণ বিষয়বস্তু দেখতে, চালান:

$ bazel config 9f87702

হোস্ট কনফিগারেশন বিশেষ আইডি (HOST) ব্যবহার করে। নন-জেনারেটেড সোর্স ফাইল, যেমন সাধারণত srcs এ পাওয়া যায়, বিশেষ আইডি (null) ব্যবহার করে (কারণ তাদের কনফিগার করার প্রয়োজন নেই)।

9f87702 সম্পূর্ণ আইডির একটি উপসর্গ। এর কারণ হল সম্পূর্ণ আইডিগুলি হল SHA-256 হ্যাশ, যেগুলি দীর্ঘ এবং অনুসরণ করা কঠিন৷ cquery একটি সম্পূর্ণ আইডির যেকোনো বৈধ উপসর্গ বোঝে, গিট শর্ট হ্যাশের মতো। সম্পূর্ণ আইডি দেখতে $ bazel config চালান।

লক্ষ্য প্যাটার্ন মূল্যায়ন

//foo foo-এর query এর চেয়ে cquery এর আলাদা অর্থ আছে। কারণ cquery কনফিগার করা লক্ষ্যগুলিকে মূল্যায়ন করে এবং বিল্ড গ্রাফে //foo এর একাধিক কনফিগার করা সংস্করণ থাকতে পারে।

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

এটি ক্যোয়ারী এক্সপ্রেশনের জন্য query চেয়ে সূক্ষ্ম ফলাফল তৈরি করে। উদাহরণস্বরূপ, নিম্নলিখিতগুলি একাধিক ফলাফল তৈরি করতে পারে:

# Analyzes //foo in the target configuration, but also analyzes
# //genrule_with_foo_as_tool which depends on a host-configured
# //foo. So there are two configured target instances of //foo in
# the build graph.
$ bazel cquery //foo --universe_scope=//foo,//genrule_with_foo_as_tool
//foo (9f87702)
//foo (HOST)

আপনি যদি সুনির্দিষ্টভাবে ঘোষণা করতে চান যে কোন দৃষ্টান্তটি অনুসন্ধান করতে হবে, config ফাংশনটি ব্যবহার করুন।

টার্গেট প্যাটার্ন সম্পর্কে আরও তথ্যের জন্য query টার্গেট প্যাটার্ন ডকুমেন্টেশন দেখুন।

ফাংশন

query দ্বারা সমর্থিত ফাংশনগুলির সেটের মধ্যে , cquery visible , siblings , buildfiles এবং tests ছাড়া সবগুলিকে সমর্থন করে৷

cquery নিম্নলিখিত নতুন ফাংশন প্রবর্তন করে:

কনফিগারেশন

expr ::= config(expr, word)

কনফিগার অপারেটর দ্বিতীয় আর্গুমেন্ট দ্বারা নির্দিষ্ট করা প্রথম আর্গুমেন্ট এবং config দ্বারা চিহ্নিত লেবেলের জন্য কনফিগার করা লক্ষ্য খুঁজে বের করার চেষ্টা করে।

দ্বিতীয় আর্গুমেন্টের জন্য বৈধ মান হল target , host , null বা একটি কাস্টম কনফিগারেশন হ্যাশ । হ্যাশ $ bazel config বা একটি cquery এর আউটপুট থেকে পুনরুদ্ধার করা যেতে পারে।

উদাহরণ:

$ bazel cquery "config(//bar, host)" --universe_scope=//foo
$ bazel cquery "deps(//foo)"
//bar (HOST)
//baz (3732cc8)

$ bazel cquery "config(//baz, 3732cc8)"

যদি প্রথম আর্গুমেন্টের সমস্ত ফলাফল নির্দিষ্ট কনফিগারেশনে পাওয়া না যায়, তবে শুধুমাত্র যেগুলি পাওয়া যায় তা ফেরত দেওয়া হয়। নির্দিষ্ট কনফিগারেশনে কোনো ফলাফল না পাওয়া গেলে, ক্যোয়ারী ব্যর্থ হয়।

অপশন

বিকল্পগুলি তৈরি করুন

cquery একটি নিয়মিত Bazel বিল্ডের উপর চলে এবং এইভাবে একটি বিল্ডের সময় উপলব্ধ বিকল্পগুলির সেট উত্তরাধিকার সূত্রে পায়।

cquery বিকল্প ব্যবহার করে

--universe_scope (কমা দ্বারা পৃথক করা তালিকা)

প্রায়শই, কনফিগার করা লক্ষ্যগুলির নির্ভরতা পরিবর্তনের মধ্য দিয়ে যায়, যার কারণে তাদের কনফিগারেশন তাদের নির্ভরশীলদের থেকে আলাদা হয়। এই পতাকাটি আপনাকে একটি লক্ষ্যকে জিজ্ঞাসা করতে দেয় যেন এটি একটি নির্ভরতা বা অন্য লক্ষ্যের একটি ট্রানজিটিভ নির্ভরতা হিসাবে তৈরি করা হয়েছিল। উদাহরণ স্বরূপ:

# x/BUILD
genrule(
     name = "my_gen",
     srcs = ["x.in"],
     outs = ["x.cc"],
     cmd = "$(locations :tool) $< >$@",
     tools = [":tool"],
)
cc_library(
    name = "tool",
)

জেনরুলগুলি হোস্ট কনফিগারেশনে তাদের সরঞ্জামগুলি কনফিগার করে যাতে নিম্নলিখিত প্রশ্নগুলি নিম্নলিখিত আউটপুটগুলি তৈরি করে:

প্রশ্ন টার্গেট বিল্ট আউটপুট
bazel cquery "//x: টুল" //x: টুল //x: টুল(targetconfig)
bazel cquery "//x:tool" --universe_scope="//x:my_gen" //x:my_gen //x: টুল(হোস্ট কনফিগ)

এই পতাকা সেট করা হলে, এর বিষয়বস্তু নির্মিত হয়। যদি এটি সেট করা না থাকে, তবে ক্যোয়ারী এক্সপ্রেশনে উল্লিখিত সমস্ত লক্ষ্যগুলি এর পরিবর্তে তৈরি করা হয়। বিল্ট টার্গেটের ট্রানজিটিভ ক্লোজার কোয়েরির মহাবিশ্ব হিসাবে ব্যবহৃত হয়। যেভাবেই হোক, তৈরি করা লক্ষ্যগুলি অবশ্যই শীর্ষ স্তরে নির্মাণযোগ্য হতে হবে (অর্থাৎ শীর্ষ-স্তরের বিকল্পগুলির সাথে সামঞ্জস্যপূর্ণ)৷ cquery এই শীর্ষ-স্তরের লক্ষ্যগুলির ট্রানজিটিভ ক্লোজার ফলাফল দেয়।

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

--implicit_deps (বুলিয়ান, ডিফল্ট=সত্য)

এই পতাকাটিকে মিথ্যা ফিল্টারে সেট করা সমস্ত ফলাফলগুলিকে বের করে দেয় যা BUILD ফাইলে স্পষ্টভাবে সেট করা হয়নি এবং পরিবর্তে Bazel দ্বারা অন্য কোথাও সেট করা হয়েছে৷ এর মধ্যে রয়েছে ফিল্টারিং সমাধান করা টুলচেন।

--tool_deps (বুলিয়ান, ডিফল্ট=সত্য)

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

--include_aspects (বুলিয়ান, ডিফল্ট=True)

দিকগুলি একটি বিল্ডে অতিরিক্ত নির্ভরতা যোগ করতে পারে। ডিফল্টরূপে, cquery দিকগুলি অনুসরণ করে না কারণ তারা অনুসন্ধানযোগ্য গ্রাফটিকে বড় করে তোলে, যা আরও মেমরি ব্যবহার করে। কিন্তু সেগুলো অনুসরণ করলে আরও সঠিক ফলাফল পাওয়া যায়।

আপনি যদি বড় প্রশ্নের মেমরি প্রভাব সম্পর্কে চিন্তিত না হন, তাহলে আপনার bazelrc-এ ডিফল্টরূপে এই পতাকাটি সক্ষম করুন।

আপনি যদি নিষ্ক্রিয় দিকগুলি নিয়ে প্রশ্ন করেন, আপনি একটি সমস্যা অনুভব করতে পারেন যেখানে লক্ষ্য Y তৈরি করার সময় লক্ষ্য X ব্যর্থ হয় কিন্তু cquery somepath(Y, X) এবং cquery deps(Y) | grep 'X' কোনো ফলাফল দেয় না কারণ নির্ভরতা একটি দিক দিয়ে ঘটে।

আউটপুট ফরম্যাট

ডিফল্টরূপে, cquery আউটপুট লেবেল এবং কনফিগারেশন জোড়ার একটি নির্ভরতা-ক্রম তালিকা তৈরি করে। ফলাফল প্রকাশের জন্য অন্যান্য বিকল্পও রয়েছে।

রূপান্তর

--transitions=lite
--transitions=full

কনফিগারেশন ট্রানজিশনগুলি শীর্ষ স্তরের লক্ষ্যগুলির চেয়ে বিভিন্ন কনফিগারেশনে শীর্ষ স্তরের লক্ষ্যগুলির নীচে লক্ষ্যগুলি তৈরি করতে ব্যবহৃত হয়।

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

এই আউটপুট বিন্যাসটি --transitions পতাকা দ্বারা ট্রিগার করা হয় যা ডিফল্টরূপে NONE তে সেট করা থাকে। এটি FULL বা LITE মোডে সেট করা যেতে পারে। FULL মোড নিয়ম শ্রেণীর ট্রানজিশন এবং ট্রানজিশনের আগে এবং পরে বিকল্পগুলির একটি বিশদ পার্থক্য সহ অ্যাট্রিবিউট ট্রানজিশন সম্পর্কে তথ্য আউটপুট করে। LITE মোড অপশন ডিফ ছাড়া একই তথ্য আউটপুট করে।

প্রোটোকল বার্তা আউটপুট

--output=proto

এই বিকল্পটি ফলে লক্ষ্যগুলি একটি বাইনারি প্রোটোকল বাফার আকারে মুদ্রিত হতে পারে। প্রোটোকল বাফারের সংজ্ঞা src/main/protobuf/analysis.proto এ পাওয়া যাবে।

CqueryResult হল শীর্ষ স্তরের বার্তা যাতে cquery-এর ফলাফল থাকে। ConfiguredTarget Configuration একটি তালিকা রয়েছে৷ প্রতিটি ConfiguredTarget এর একটি configuration_id থাকে যার মান সংশ্লিষ্ট Configuration বার্তা থেকে id ক্ষেত্রের সমান।

--[না]প্রোটো:include_configurations

ডিফল্টরূপে, cquery ফলাফল প্রতিটি কনফিগার করা লক্ষ্যের অংশ হিসাবে কনফিগারেশন তথ্য প্রদান করে। আপনি যদি এই তথ্যটি বাদ দিতে চান এবং প্রোটো আউটপুট পেতে চান যা হুবহু ক্যোয়ারির প্রোটো আউটপুটের মতো ফর্ম্যাট করা হয়, তাহলে এই পতাকাটিকে মিথ্যাতে সেট করুন৷

আরও প্রোটো আউটপুট-সম্পর্কিত বিকল্পগুলির জন্য ক্যোয়ারীটির প্রোটো আউটপুট ডকুমেন্টেশন দেখুন।

গ্রাফ আউটপুট

--output=graph

এই বিকল্পটি একটি Graphviz-সামঞ্জস্যপূর্ণ .dot ফাইল হিসাবে আউটপুট তৈরি করে। বিস্তারিত জানার জন্য query গ্রাফ আউটপুট ডকুমেন্টেশন দেখুন। cquery --graph:node_limit এবং --graph:factored :factored সমর্থন করে।

ফাইল আউটপুট

--output=files

এই বিকল্পটি একটি bazel build আহ্বানের শেষে মুদ্রিত তালিকার অনুরূপ প্রশ্নের সাথে মিলে যাওয়া প্রতিটি লক্ষ্য দ্বারা উত্পাদিত আউটপুট ফাইলগুলির একটি তালিকা প্রিন্ট করে। আউটপুটটিতে শুধুমাত্র অনুরোধকৃত আউটপুট গ্রুপে বিজ্ঞাপন দেওয়া ফাইলগুলি থাকে যেমন --output_groups পতাকা দ্বারা নির্ধারিত হয় এবং কখনোই উৎস ফাইল থাকে না।

Starlark ব্যবহার করে আউটপুট বিন্যাস সংজ্ঞায়িত করা

--output=starlark

এই আউটপুট বিন্যাসটি ক্যোয়ারী ফলাফলে প্রতিটি কনফিগার করা লক্ষ্যের জন্য একটি স্টারলার্ক ফাংশন কল করে এবং কল দ্বারা প্রত্যাবর্তিত মান প্রিন্ট করে। --starlark:file পতাকা একটি Starlark ফাইলের অবস্থান নির্দিষ্ট করে যা একটি একক প্যারামিটার, target সহ format নামের একটি ফাংশন সংজ্ঞায়িত করে। এই ফাংশনটি ক্যোয়ারী ফলাফলের প্রতিটি লক্ষ্যের জন্য বলা হয়। বিকল্পভাবে, সুবিধার জন্য, আপনি def format(target): return expr হিসাবে ঘোষিত একটি ফাংশনের মূল অংশ নির্দিষ্ট করতে পারেন --starlark:expr পতাকা ব্যবহার করে expr ফেরত দিন।

'cquery' স্টারলার্ক উপভাষা

cquery Starlark পরিবেশ একটি BUILD বা .bzl ফাইল থেকে আলাদা। এটিতে সমস্ত মূল স্টারলার্ক অন্তর্নির্মিত ধ্রুবক এবং ফাংশন অন্তর্ভুক্ত রয়েছে, এছাড়াও নীচে বর্ণিত কয়েকটি glob নির্দিষ্ট, কিন্তু (উদাহরণস্বরূপ) গ্লোব , native বা rule নয় এবং এটি লোড স্টেটমেন্ট সমর্থন করে না।

বিল্ড_বিকল্প (লক্ষ্য)

build_options(target) একটি মানচিত্র প্রদান করে যার কীগুলি হল বিল্ড বিকল্প শনাক্তকারী ( কনফিগারেশন দেখুন) এবং যার মানগুলি তাদের স্টারলার্ক মান। বিল্ড বিকল্প যার মান বৈধ নয় Starlark মান এই মানচিত্র থেকে বাদ দেওয়া হয়েছে.

যদি টার্গেটটি একটি ইনপুট ফাইল হয়, build_options(target) None প্রদান করে, কারণ ইনপুট ফাইল টার্গেটের একটি নাল কনফিগারেশন থাকে।

প্রদানকারী (লক্ষ্য)

providers(target) একটি মানচিত্র ফেরত দেয় যার কীগুলি প্রদানকারীদের নাম (উদাহরণস্বরূপ, "DefaultInfo" ) এবং যার মানগুলি তাদের স্টারলার্ক মান। যেসব প্রদানকারীর মান বৈধ নয় Starlark মান এই মানচিত্র থেকে বাদ দেওয়া হয়েছে।

উদাহরণ

//foo দ্বারা উত্পাদিত সমস্ত ফাইলের বেস নামের একটি স্থান-বিচ্ছিন্ন তালিকা প্রিন্ট করুন:

  bazel cquery //foo --output=starlark \
    --starlark:expr="' '.join([f.basename for f in target.files.to_list()])"

//bar এবং এর সাবপ্যাকেজে নিয়ম লক্ষ্য দ্বারা উত্পাদিত সমস্ত ফাইলের পাথগুলির একটি স্থান-বিচ্ছিন্ন তালিকা প্রিন্ট করুন:

  bazel cquery 'kind(rule, //bar/...)' --output=starlark \
    --starlark:expr="' '.join([f.path for f in target.files.to_list()])"

//foo দ্বারা নিবন্ধিত সমস্ত কর্মের স্মৃতিবিদ্যার একটি তালিকা প্রিন্ট করুন।

  bazel cquery //foo --output=starlark \
    --starlark:expr="[a.mnemonic for a in target.actions]"

একটি cc_library //baz দ্বারা নিবন্ধিত সংকলন আউটপুটগুলির একটি তালিকা প্রিন্ট করুন।

  bazel cquery //baz --output=starlark \
    --starlark:expr="[f.path for f in target.output_groups.compilation_outputs.to_list()]"

কমান্ড লাইন বিকল্পের মান প্রিন্ট করুন --javacopt //foo তৈরি করার সময়।

  bazel cquery //foo --output=starlark \
    --starlark:expr="build_options(target)['//command_line_option:javacopt']"

ঠিক একটি আউটপুট সহ প্রতিটি লক্ষ্যের লেবেল প্রিন্ট করুন। এই উদাহরণটি একটি ফাইলে সংজ্ঞায়িত Starlark ফাংশন ব্যবহার করে।

  $ cat example.cquery

  def has_one_output(target):
    return len(target.files.to_list()) == 1

  def format(target):
    if has_one_output(target):
      return target.label
    else:
      return ""

  $ bazel cquery //baz --output=starlark --starlark:file=example.cquery

প্রতিটি টার্গেটের লেবেল প্রিন্ট করুন যা কঠোরভাবে Python 3। এই উদাহরণটি একটি ফাইলে সংজ্ঞায়িত Starlark ফাংশন ব্যবহার করে।

  $ cat example.cquery

  def format(target):
    p = providers(target)
    py_info = p.get("PyInfo")
    if py_info and py_info.has_py3_only_sources:
      return target.label
    else:
      return ""

  $ bazel cquery //baz --output=starlark --starlark:file=example.cquery

একটি ব্যবহারকারী সংজ্ঞায়িত প্রদানকারী থেকে একটি মান নিষ্কাশন করুন.

  $ cat some_package/my_rule.bzl

  MyRuleInfo = provider(fields={"color": "the name of a color"})

  def _my_rule_impl(ctx):
      ...
      return [MyRuleInfo(color="red")]

  my_rule = rule(
      implementation = _my_rule_impl,
      attrs = {...},
  )

  $ cat example.cquery

  def format(target):
    p = providers(target)
    my_rule_info = p.get("//some_package:my_rule.bzl%MyRuleInfo'")
    if my_rule_info:
      return my_rule_info.color
    return ""

  $ bazel cquery //baz --output=starlark --starlark:file=example.cquery

প্রশ্ন বনাম ক্যোয়ারী

cquery এবং query একে অপরের পরিপূরক এবং বিভিন্ন কুলুঙ্গিতে এক্সেল। আপনার জন্য কোনটি সঠিক তা নির্ধারণ করতে নিম্নলিখিতগুলি বিবেচনা করুন:

  • cquery আপনার তৈরি করা সঠিক গ্রাফের মডেল করতে নির্দিষ্ট select() শাখা অনুসরণ করে। query বিল্ড কোন শাখাটি বেছে নেয় তা জানে না, তাই সমস্ত শাখা অন্তর্ভুক্ত করে আনুমানিক।
  • cquery এর নির্ভুলতার জন্য query চেয়ে বেশি গ্রাফ তৈরি করা প্রয়োজন। বিশেষভাবে, cquery কনফিগার করা লক্ষ্যগুলিকে মূল্যায়ন করে যখন query শুধুমাত্র লক্ষ্যগুলিকে মূল্যায়ন করে। এটি আরও সময় নেয় এবং আরও মেমরি ব্যবহার করে।
  • প্রশ্ন ভাষার cquery এর ব্যাখ্যা অস্পষ্টতার পরিচয় দেয় যা query এড়িয়ে যায়। উদাহরণস্বরূপ, যদি দুটি কনফিগারেশনে "//foo" বিদ্যমান থাকে, তাহলে cquery "deps(//foo)" ব্যবহার করা উচিত কোনটি? [config](#config) ফাংশন এটিতে সাহায্য করতে পারে।
  • একটি নতুন টুল হিসাবে, cquery নির্দিষ্ট ব্যবহারের ক্ষেত্রে সমর্থনের অভাব রয়েছে। বিস্তারিত জানার সমস্যা দেখুন।

জ্ঞাত সমস্যা

"বিল্ড" cquery করা সমস্ত লক্ষ্য একই কনফিগারেশন থাকতে হবে।

প্রশ্ন মূল্যায়ন করার আগে, cquery একটি বিল্ড আপ ট্রিগার করে যেখানে বিল্ড অ্যাকশন চালানো হবে। এটি যে লক্ষ্যগুলি "নির্মাণ করে" তা ডিফল্টরূপে ক্যোয়ারী এক্সপ্রেশনে উপস্থিত সমস্ত লেবেল থেকে নির্বাচিত হয় (এটি --universe_scope দিয়ে ওভাররাইড করা যেতে পারে)। এই একই কনফিগারেশন থাকতে হবে.

যদিও এগুলি সাধারণত শীর্ষ-স্তরের "লক্ষ্য" কনফিগারেশন ভাগ করে, নিয়মগুলি ইনকামিং এজ ট্রানজিশনের সাথে তাদের নিজস্ব কনফিগারেশন পরিবর্তন করতে পারে৷ এখানেই cquery পড়ে।

ওয়ার্কঅ্যারাউন্ড: যদি সম্ভব হয়, --universe_scope একটি কঠোর পরিসরে সেট করুন। উদাহরণ স্বরূপ:

# This command attempts to build the transitive closures of both //foo and
# //bar. //bar uses an incoming edge transition to change its --cpu flag.
$ bazel cquery 'somepath(//foo, //bar)'
ERROR: Error doing post analysis query: Top-level targets //foo and //bar
have different configurations (top-level targets with different
configurations is not supported)

# This command only builds the transitive closure of //foo, under which
# //bar should exist in the correct configuration.
$ bazel cquery 'somepath(//foo, //bar)' --universe_scope=//foo

--output=xml জন্য কোন সমর্থন নেই।

নন-ডিটারমিনিস্টিক আউটপুট।

cquery স্বয়ংক্রিয়ভাবে পূর্ববর্তী কমান্ড থেকে বিল্ড গ্রাফ মুছে দেয় না এবং তাই অতীতের প্রশ্নগুলি থেকে ফলাফল বাছাই করার প্রবণ। উদাহরণস্বরূপ, genquery তার tools এট্রিবিউটে একটি হোস্ট ট্রানজিশন প্রয়োগ করে - অর্থাৎ, এটি হোস্ট কনফিগারেশনে তার টুলগুলিকে কনফিগার করে।

আপনি নীচে সেই রূপান্তরের দীর্ঘস্থায়ী প্রভাবগুলি দেখতে পারেন।

$ cat > foo/BUILD <<<EOF
genrule(
    name = "my_gen",
    srcs = ["x.in"],
    outs = ["x.cc"],
    cmd = "$(locations :tool) $< >$@",
    tools = [":tool"],
)
cc_library(
    name = "tool",
)
EOF

    $ bazel cquery "//foo:tool"
tool(target_config)

    $ bazel cquery "deps(//foo:my_gen)"
my_gen (target_config)
tool (host_config)
...

    $ bazel cquery "//foo:tool"
tool(host_config)

ওয়ার্কঅ্যারাউন্ড: কনফিগার করা লক্ষ্যগুলির পুনরায় বিশ্লেষণ জোরপূর্বক করার জন্য যেকোনো স্টার্টআপ বিকল্প পরিবর্তন করুন। উদাহরণস্বরূপ, যোগ করুন --test_arg=&lt;whatever&gt; আপনার বিল্ড কমান্ডে।

সমস্যা সমাধান

পুনরাবৃত্তিমূলক লক্ষ্য নিদর্শন ( /... )

যদি আপনি সম্মুখীন হন:

$ bazel cquery --universe_scope=//foo:app "somepath(//foo:app, //foo/...)"
ERROR: Error doing post analysis query: Evaluation failed: Unable to load package '[foo]'
because package is not in scope. Check that all target patterns in query expression are within the
--universe_scope of this query.

এটি ভুলভাবে প্রস্তাব করে যে প্যাকেজ //foo সুযোগের মধ্যে নেই যদিও --universe_scope=//foo:app এটি অন্তর্ভুক্ত করে। এটি cquery এ ডিজাইনের সীমাবদ্ধতার কারণে। একটি সমাধান হিসাবে, মহাবিশ্বের সুযোগে স্পষ্টভাবে //foo/... অন্তর্ভুক্ত করুন:

$ bazel cquery --universe_scope=//foo:app,//foo/... "somepath(//foo:app, //foo/...)"

যদি এটি কাজ না করে (উদাহরণস্বরূপ, //foo/... এ কিছু টার্গেট নির্বাচিত বিল্ড ফ্ল্যাগগুলির সাথে তৈরি করতে পারে না), ম্যানুয়ালি একটি প্রাক-প্রসেসিং ক্যোয়ারী সহ এর উপাদান প্যাকেজগুলিতে প্যাটার্নটি খুলে ফেলুন:

# Replace "//foo/..." with a subshell query call (not cquery!) outputting each package, piped into
# a sed call converting "<pkg>" to "//<pkg>:*", piped into a "+"-delimited line merge.
# Output looks like "//foo:*+//foo/bar:*+//foo/baz".
#
$  bazel cquery --universe_scope=//foo:app "somepath(//foo:app, $(bazel query //foo/...
--output=package | sed -e 's/^/\/\//' -e 's/$/:*/' | paste -sd "+" -))"