পাঠনের সময়: ১১ মিনিট।

।লক্ষ্যমাত্রা : gradle ডেভেলপারদের যিনি আগে Jadukrito অথবা apratyashit bygg ācharaner sammukhīn ছিলেন।

ভূমিকা

Dans notre aventure de création du plugin site-baker, আমরা কঠোর TDD (Test‑Driven Development) পদ্ধতি অনুসরণ করেছি। প্রতিটি ফিচার পরীক্ষা করা হয়েছিল, যাচাই করা হয়েছিল এবং আমরা বিশ্বাসের সঙ্গে অগ্রসর হচ্ছিলাম। তারপর একদিন অপ্রত্যাশিত একটি ঘটনা ঘটল। বিল্ডগুলো অসঙ্গত আচরণmeye দেখানো শুরু করল। প্লাগinin লজিক বা কনফিগারেশন ফাইলগুলোর পরিবর্তনগুলো উপেক্ষা করা মনে হচ্ছিল এবং আমাদের ফাংশনাল টেস্টস, যা পূর্বে বিশ্বাসযোগ্য ছিল, কোনো স্পষ্ট causas ছাড়া ব্যর্থ হয়েছে।

এই ধরনের সমস্যা অবিশ্বাস্যপূর্ণ মাত্রা পর্যন্ত নিরাশাজনক হতে পারে। এটি সরঞ্জামের বিশ্বস্ততা এবং আমাদের কোডের বৈধতার 위에 প্রশ্ন উঠায়। একটি তীব্র ডিবাগিং সেশনের পর, অপরাধীকে চিহ্নিত করা হয়েছে: leগ্রেডেল কনফিগারেশান ক্যাশ.

লক্ষণ : ভূতের বিল্ডস

সমস্যা বিবিধ উপায়ে প্রকাশিত হইলো :

  1. আমি একটি কাজে একটি অক্ষর স্ট্রিং পরিবর্তন করছিলাম`println`, но পুরনো স্ট্রীিং চলমান 실행-এ দেখাতে থাকত।

  2. আমি আমার ফাইলে একটি মান পরিবর্তন করছিলাম`managed-jbake-context.yml`, কিন্তু প্লাগইন কাজ করছে যেন ফাইলটি পরিবর্তিত হয়নি।

  3. ফাংশনাল পরীক্ষা, যা দ্রুত পরীক্ষা প্রকল্প তৈরি করে, ব্যর্থ ছিল因为 প্লাগিনটি তাজা তৈরি কনফিগারেশন ফাইল সনাক্ত করা মনে হইনি।

সবকিছু ঠিক motif চলছিল যলেন গ্রেডল আমাদের বিল্ডের একটি 'ফ্যান্টম संस्करण' এক্সিকিউশন করছিল, আমাদের सर्वশেষ পরিবর্তনগুলোকে উপেক্ষা করে

অনুসন্ধান: কনফিগারেশন ক্যাশ কী?

কনফিগারেশন ক্যাশ হল Gradle-এর একটি আপেক্ষিকভাবে আধুনিক এবং অত্যন্ত শক্তিশালী বৈশিষ্ট্য, যা নতুন সংস্করণগুলিতে ডিফল্টভাবে সক্রিয় করা হয়েছে। এর লক্ষ্য বিল্ডকে দ্রুত করা।

সিধান্ত সহজ :
  1. প্রথমবার চালানোর সময়ে, Gradle পর্যায়টি চালায়কনফিগারেশনপাঠ`build.gradle.kts`, টাস্ক তৈরি, নির্ভরতা সমাধান) এবং একটি টাস্ক গ্রাফ তৈরি করে।

  2. এই পর্যায়ের শেষে, Gradleএই টাস্ক গ্রাফটিকে সিরিয়ালাইজ করুনএবং তা ক্যাশে রাখে.

  3. পরবর্তী চালানোর সময়, যদি কিছু পরিবর্তিত না হয় (বিল্ড স্ক্রিপ্টের,gradle.properties), গ্র্যাডলকনফিগারেশন ধাপটি পূর্ণরূপে এড়িয়ে যানও ক্যাশে করা টাস্ক গ্রাফ পুনরায় ব্যবহার করা হয়।

বড় প্রকল্পগুলোতে thời gian সাশ্রয় খুবই অসাধারণ। তবে এই কর্মক্ষমতায় একটি দাম রয়েছে: প্লাগইনগুলো কীভাবে লিখা উচিত তা নিয়ে কঠোর বিধি প্রয়োগ করা হয়।

কনফিগারেশন ক্যাশের জীবনের চক্র
@startuml
start
:প্রথম চালানো;
:কনফিগারেশনের পর্যায়;
:টাস্ক граফ তৈরি;
:গ্রাফের ক্যাশিং;
:নিষ্পাদনের পর্যায়;
end

start
:পরবর্তী এক্সিকিউশন;
if (Cache valide ?) then (oui)
  :ক্যাশ থেকে গ্রাফের পুনঃস্থাপন;
  note right
কনফিগারেশন পর্যাYটি বাদ দেওয়া হয়েছে!
  end note
else (non)
  :কনফিগারেশনের পর্যায়;
  :ক্যাশ আপডেট;
endif
:নিষ্পাদনের পর্যায়;
stop
@enduml

সমস্যা કારণ : একটি অ‑অনুপালিত প্লাগইন

আমাদের প্লাগইন`site-baker`তাঁর কোনো জ্ঞান না থাকলেও, সে কনফিগারেশন কাশের很多 নিয়ম লঙ্ঘন করছিল। একটি টাস্ক গ্রাফকে সিরিয়ালাইজযোগ্য করতে, টাস্কগুলোর জটিল বস্তু যেমন object এর রেফারেন্স থাকা উচিত না।`Project`বা কার্যকরনের পর্যায়ে ফাইলগুলো অনিয়ন্ত্রিতভাবে পড়া যায়।

আমাদের মূল ভুল ছিল যে আমরা সরাসরি কাজ নিষ্পত্তি লজিকের মধ্যে YAML ফাইলের বিষয়বস্তু পড়ছিলাম, আমাদের এক্সটেনশনে সংরক্ষিত পাথ রেফারেন্স ব্যবহার করে। এই পদ্ধতি ক্যাশের সাথে সামঞ্জস্যপূর্ণ নয়, কারণ গ্রেডল এটি না মডেলিং করে পড়া হলে জানতে পারবে না যে ফাইলের বিষয়বস্তু পরিবর্তিত হয়েছে কি না।টাস্ক এন্ট্রি (Task Input).

অস্থায়ী সমাধান: ক্যাশ নিষ্ক্রিয় করুন

আমাদেরকে অনব্লক করতে এবং পূর্বাভাসযোগ্য বিল্ড আচরণ ফিরিয়ে আনতে, ত্বরিত সমাধান কনফিগারেশন ক্যাশ নিষ্ক্রিয় করা ছিল। ফাইলে নিম্নলিখিত লাইন যোগ করলে যথেষ্ট।gradle.properties`প্রজেক্টটি যা প্লাগইন ব্যবহার করে (আমাদের ক্ষেত্রে, পরীক্ষার প্রজেক্ট)`site-baker).

# site-baker/gradle.properties
org.gradle.configuration-cache=false

তৎক্ষণে, বিল্ডগুলো സ്വাভাবিক আচরণ ফিরিয়েছে। প্রতিটি চালান কনফিগারেশন পর্যায়টি পুনরায় শুরু করত এবং আমাদের পরিবর্তনগুলো বিবেচনা করা

এটি একটি সমাধান যা দ্রুত কাজ করে কিন্তু একটি স্থায়ী সমাধান নয়—এটি কার্যকারিতায় হানি করে এবং আমাদের প্লাগইনের মৌলিক সমস্যা সমাধান করে না।

সত্যিকারের সমাধান : প্লাগইনকে সামঞ্জস্যপূর্ণ করা

একটি প্লাগইনকে আধুনিক গ্রেডেল ইকোসিস্টেমের ভাল নাগরিক হওয়া গুণ রাখতে, তাকে কনফিগারেশন কাশে সামঞ্জস্যপূর্ণ হونا উচিত; এর মানে আমাদের টাস্কে ডেটা কিভাবে প্রবাহিত হয় সেই প্রক্রিয়াটি পুনর্গঠন করতে হবে।

কী হলো deras ব্যবহার করাপ্রদানকারী APIগ্রেডলের। বসুতি সরাসরি মান পাস করার পরিবর্তে (একটি`String` ou un File) আমাদের কাজে আমরা কিছু সময় ব্যয় করতে হবে`Property<T>`বা কিছু`Provider<T>`.

।এটি হলো পునর্গঠনের পরিকল্পনা :

  1. টাস্কের এন্ট্রি ঘোষণা করুন:YAML ফাইলটি পার্স করার টাস্ককে এই ফাইলকে একটি ইনপুট হিসেবে ঘোষণা করতে হবে। এজন্য আমরা এই অ্যানোটেশন ব্যবহার করি।@InputFile.

[source,kotlin] ---- @get:InputFile abstract val configFile: RegularFileProperty ----


সম্পর্কিত নিবন্ধ