কেন `serve` প্রদর্শন করছিল একটি দুর্লোক website যখন `publishSite` ছিল সুপরিষ্কার
Publié le 22 April 2026
আপনি যে মুহূর্তটি চিনেন যখন আপনার লোকাল সাইটটি কোনো কিছু না মনে হওয়ার মতো দেখায়, কিন্তু একবার آنলাইনে স্থাপিত হলে সবকিছু ঠিকঠাক হয়ে যায়? এটাই যা Gradle JBake প্লাগইন দিয়ে আমার সঙ্গে ঘটেছিল। কাজটি`serve`দেখাচ্ছিল বর্গ বোতাম, কালো পটভূমিরউপর ঢালু টেক্সট, এবং একটি অদ্ভুতভাবে অনুপস্থিত CSS। তবে`publishSite`উৎপন্ন করত একই সাইট, এkei, নির্ডোষ. দোষী ছিল CSS না, ব্রাউজার না, ক্যাশ না. এটি ছিল একটি Kotlin কোড লাইন — এবং কমান্ড লাইন আর্গুমেন্টের সঙ্গে একটি খারাপ অভ্যাস।
- টক
-
([])
দৃশ্য : চারটি স্ক্রিনশট, দুটি রেন্ডার
এটি একটি সিস্টেমক্র্যাশের পরে ছিল। আমি স্থানীয় রেন্ডারিং তুলনা করার জন্য চারটি স্ক্রীনশট নিয়েছিলাম (./gradlew serve`উপর`localhost:8820) ইনলাইন রেন্ডারিং সঙ্গে (`publishSite`গিটহাব পেজ)। প্রতি পৃষ্ঠায় দুটি স্ক্রিনশট: উপরের অংশ এবং নিচের অংশ।
স্থানীয় রেন্ডারিং
পৃষ্ঠার শীর্ষ— বোতাম Project এবং Template*ছোট, আয়তাকোষ, স্ট্যান্ডার্ড রঙ (নীল ও সবুজ)। *Start Writing কয়ার্ড একটিএকরঙা কালো পটভূমি, ফ্রেম ছাড়া.
পাতার নিচের অংশ— উপশিরোনাম "সর্বশেষ लेख ও সম্পদ" আছেপ্রায় অপঠনীয়, খুব গাড়া কালো পৃষ্ঠভূমি. ব্লগ ছবির নিচের তারিখগুলো ("17 October 2013", ইত্যাদি) আছেনঅনুপস্থিত.
অনলাইনে রেন্ডার
পৃষ্ঠার শীর্ষ— একই বোতামগুলো আছেবড়, ভেড়ার, চমকদার নিয়ন সবুজ, বড় হাতের অক্ষরের পাঠ্য. কার্ডে একটিসাদা গolakার নিম্নাগত ছায়াযুক্ত ফ্রেম.
পৃষ্ঠার নিচ— উপশিরোনামটিসুবিধাজনক পঠনযোগ্য. তারিখ_groupspace_있다দৃশ্যমান. আর্টিকেল কার্ডগুলো আছেবৃত্তাকার কোণএবং শিরোনামগুলো হলভড়া.
প্রথম প্রতিক্রিয়া: থিম। আমি একটি ডায়নামিক থিম (উজ্জ্বল, আন্ধকার, high-contrast) সিস্টেম ব্যবহার করছি যা`localStorage`. विश्वাস করছেন যে লোকাল স্টোরটি একটি উচ্চ-কন্ট্রাস্ট থিম ট্রিগার করছিল? না। আমি ইতিমধ্যে লিখেছিলামhttps://cheroliv.com/blog/2025/0098_preloading_css_variable_post.html[একটি পূর্ণাঙ্গ নিবন্ধ থিমের প্রিলোডিং সম্পর্কে], আমি জানি কীভাবে এটি কাজ করে. এবং, হাই-কন্টারাস্ট মোডেও, CSS-এর গঠন (ওভাল বোতাম, ছায়া) থাকতে উচিত ছিল। এটা ছিল না।
দ্বিতীয় প্রতিক্রিয়া: ব্রাউজার ক্যাশ। না, আমি পরিষ্কার প্রোফাইল দিয়ে পরীক্ষা করেছিলাম। পার্থক্য দৃঢ়ভাবে থাকত ছিল।
তৃতীয় প্রতিক্রিয়া:`serve`একই ফাইলগুলো পরিষেবা দেননি যেমন`publishSite`.
নিদান : serve সঠিক ফোল্ডারের দিকে নির্দেশ করত না
আমার Gradle প্লাগইন`bakery`দুটি প্রধান কাজ আছে :
-
bake: স্ট্যাটিক সایت তৈরি করে এ`build/bake/` -
serve: একটি স্থানীয় ওয়েব সার্ভার চালু করে -
publishSite: কেলে`build/bake/`GitHub Pages-এর দিকে
ভেদ শুধুমাত্র আসতে পারে`serve`. Si publishSite`সঠিক বিষয়বস্তু প্রকাশ করত, যা হলো`build/bake/`ভাল ছিল। যদি`serve`এটি অন্য কিছু দেখাচ্ছিল, অর্থাৎ এটি কাজ করত না`build/bake/.
আমরা কোডটি দেখি. অ ভিতরে`SiteManager.kt`, কাজ`serve`এভাবে সংজ্ঞায়িত করা হয়েছে :
tasks.register("serve", JavaExec::class.java) { task ->
task.apply {
mainClass.set("org.jbake.launcher.Main")
classpath = jbakeRuntime
environment("GEM_PATH", jbakeRuntime.asPath)
jvmArgs(/* ... */)
args = listOf(
"-b", file(site.bake.srcPath).absolutePath,
"-s", layout.buildDirectory.get()
.asFile.resolve(site.bake.destDirPath)
.absolutePath
)
}
}
org.jbake.launcher.Main`এই JBake CLI 2.7.0-র প্রবেশ বিন্দু। ধারনা : যাওয়া-b`উত্স ফোল্ডারের জন্য এবং`-s`গন্তব্য ফোল্ডারের জন্য, তারপর সার্ভার মোড চালু করুন। কিন্তু…
মূল কারণ: JBake CLI এইভাবে কাজ করে না
JBake 2.7.0 অপেক্ষা করছেপজিশনাল আর্গুমেন্টসোর্স এবং ডেস্টিনেশনের জন্য, তারপর ঐচ্ছিক ফ্ল্যাগ। স্বাক্ষরটি হলঃ
jbake <source> <destination> [options]
তবে আমার কোডে আমি লিখছিলাম:
args = listOf("-b", "/path/to/site", "-s", "/path/to/build/bake")
JBake এটিকে এইভাবে বুঝত :
-
-b\"bake\" ফ্ল্যাগ (বুলিয়ান) পার্স করা হয়েছে, ব্যাবহৃত -
/path/to/site→ পজিশনাল আর্গুমেন্ট 1 (উৎস) -
-s→ পার্স ফ্ল্যাগ "serve" (বুলিয়ান), সার্ভার চালু হয়েছেঅবিলম্বে -
/path/to/build/bake→ একটি অনুথক্তি হয়ে যায়, যা উপেক্ষা করা হয় বা ভুলে বোঝা হয়
ফল : JBake নীয়েছিল`/path/to/site`উৎস作为,গন্তব্য বিবেচনা করেননিপ্রদানকৃত (build/bake), এবং ব্যবহার করত তার রিপার্টোয়ার ডিফল্ট (প্রায়ে`./output`অথবা একটি অস্থায়ী নকল) ফাইল`css/styles.css`বিল্ডটি তাই চাপে দেওয়া
তুলনায়,bake et publishSite`তারা এটি ব্যবহার করেঅফিশিয়াল Gradle JBake প্লাগিন (`jbake-gradle-plugin) যে পরিষ্কারভাবে লিখে`build/bake/`গ্রেডল API এর মাধ্যমে। তারা CLI-এ পাস করেন না।
সমাধান: পজিশনাল আর্গুমেন্ট, ফ্ল্যাগ নয়
সংশোধনটি সহজ — একবার আপনি জেনে ফেলে। শুধু উৎস ও গন্তব্য কে পজিশনাল আর্গুমেন্ট হিসেবে পাস করুন, তারপর`-s`শেষে:
args = listOf(
file(site.bake.srcPath).absolutePath,
layout.buildDirectory.get()
.asFile.resolve(site.bake.destDirPath)
.absolutePath,
"-s"
)
এইটাই। তিন লাইন পরিবর্তন করা হয়েছে, বাগ সমাধান করা হয়েছে।
প্লাগইনটি স্থানীয়ভাবে প্রকাশ করা পরে (publishToMavenLocal), un `./gradlew serve`JBake-কে সঠিক সিনট্যাক্স দিয়ে চালু করুন :
jbake /home/user/project/site /home/user/project/build/bake -s
এইবারও, JBake-এ একীভূত Jetty সার্ভার নিম্নোক্ত কন্টেন্টকে ভালভাবে পরিবেশন করে`build/bake/`— অনলাইনে প্রকাশিতের মতো।
curl দিয়ে দ্রুত যাচাই
সার্ভারটি সঠিক কন্টেন্ট পরিষেবা দেয় তা নিশ্চিত করার জন্য, একটি সহজ`curl`যা নিশ্চিত করে`index.html`শামিল`data-bs-theme="light"`এবং যে`build/bake/css/styles.css`সঠিকভাবে ওজন করে ৩১,৪০২ বাইট — তৈরীকৃত ফাইলের মতো একই`bake`।
$ ./gradlew serve
# Dans un autre terminal :
$ curl -s http://localhost:8820/ | grep data-bs-theme
<html ... data-bs-theme="light" ...>
$ curl -I http://localhost:8820/css/styles.css
HTTP/1.1 200 OK
Content-Length: 31402
Content-Type: text/css
লোকাল রেন্ডারিং এখনপিক্সেল-একইডিপ্লয় করা রেন্ডারিং-এ।
এই বাগটি কেন দুষ্ট ছিল?
আপনি কেন এটি ধরা কঠিন ছিল তা দেখছেন?
-
স্পষ্ট ত্রুটি নেইJBake দ্রুত নেই। সে "কাজ করছিল" শুধুমাত্র একটি ভুল ফোল্ডারের সাথে।
-
বিল্ডটি কাজ করছিল :
./gradlew bake`সঠিকভাবে ফাইলগুলো তৈরি করছিল মধ্যে`build/bake/. -
ডিপ্লয়মেন্ট কাজ করছিল:`publishSite`ভালো কন্টেন্টকে অনলাইনে প্রচার করছিল।
-
শুধু
serveটুটে গেছিল।: বিকাশ কাজ, যা আমরা ধারাবাহিকভাবে ব্যবহার করি পুনরাবৃত্তি করার জন্য. -
অভ্যাস
-key value: ডেভেলপার হিসাবে, আমরা CLI Unixের বছরগুলো দ্বারা শর্তিত (-o output`,-i input). JBake CLI একটি ব্যতিক্রম — উৎস এবং গন্তব্য পজিশনাল.
নিষ্কর্ষ
আপনি যদি একটি Gradle প্লাগইন বজায় রাখেন যা JBake-কে আবরণ করে (বা যেকোনো CLI উপকরণ),আর্গুমেন্টের ডক পড়ুনআপনি যদি তদেরকে জানতে ভাবেন, তবও। একটি অব প্রকাশিত ধারণা (-s= "set destination") এটি আপনাকে ভিজ্যুয়াল ডিবাগিংয়ে ঘন্টারও খরচ করতে পারে।
এখানে, সংশোধনটি শব্দবদ্ধভাবে পরিবর্তন করতে ছিল:
args = listOf("-b", src, "-s", dest) // ❌ BUG
en :
args = listOf(src, dest, "-s") // ✅ FIX
তিনটি টোকেন স্থানান্তরিত হলে, আমার স্থানীয় সাইট উত্পাদন সাইটের মতো সুন্দর হয়ে ওঠে।
পাঠ�যখন রেন্ডারিং স্থানীয় ও উত্পাদনে কোনো স্পষ্ট কারণেই ভিন্ন হয়, প্রথমে pipeline‑কে সন্দেহ করুন — CSS নয়, ব্রাউজার নয়, এবং ফ্রেমওয়ার্কও নয়। প্রায়শই, রেন্ডারিং-এর 바로 আগের ধাপই প্রতারণা করে।