settings.gradle হল মূল Gradle কনফিগারেশন ফাইল যা একটি মাল্টি-মডিউল প্রজেক্টের কাঠামো নির্ধারণ করে: কোন মডিউল বিল্ডে অন্তর্ভুক্ত, কোন প্লাগইন উপলব্ধ এবং কীভাবে নির্ভরতাগুলি সমাধান করা হয়। যেখানে build.gradle বর্ণনা করে কীভাবে প্রতিটি মডিউল তৈরি করতে হয়, settings.gradle বর্ণনা করে প্রজেক্টটি কোন মডিউল নিয়ে গঠিত। Gradle ডকুমেন্টেশন, 2025 অনুসারে, settings.gradle-এর সঠিক কনফিগারেশন মডিউল রেজোলিউশন অপ্টিমাইজেশনের কারণে মাল্টি-মডিউল প্রজেক্টের কনফিগারেশন সময় 25% হ্রাস করে। ফাইলটি Initialization পর্যায়ে নির্বাহ করা হয় — Gradle বিল্ড জীবনচক্রের প্রথম পর্যায়।
মূল পয়েন্ট
settings.gradle (বা Kotlin DSL-এর জন্য settings.gradle.kts) একটি ফাইল যা Gradle Initialization পর্যায়ে নির্বাহ করে। এতে প্রজেক্টের শ্রেণিবিন্যাস নির্ধারণ করা হয়, মডিউল অন্তর্ভুক্ত করা হয় এবং প্লাগইন ও নির্ভরতার জন্য রিপোজিটরি কনফিগার করা হয়। settings.gradle ছাড়া, Gradle জানে না কোন মডিউল তৈরি করতে হবে এবং কোন প্লাগইন উপলব্ধ। একক-মডিউল প্রজেক্টে, settings.gradle অনুপস্থিত থাকতে পারে — Gradle ডিফল্ট মান ব্যবহার করে, কিন্তু মাল্টি-মডিউল প্রজেক্টের জন্য এটি বাধ্যতামূলক।
settings.gradle ফাইলটি প্রজেক্ট রুটে, মূল build.gradle-এর পাশে অবস্থিত। একটি সাধারণ রুট প্রজেক্ট কাঠামো: settings.gradle.kts, build.gradle.kts, gradle.properties, local.properties, gradle/wrapper/। settings.gradle build.gradle-এর আগে নির্বাহিত হয় — Initialization পর্যায়ে, Gradle প্রজেক্ট ট্রি (Gradle API-তে Project) তৈরি করে। Initialization সম্পূর্ণ হওয়ার পর, Configuration শুরু হয় — প্রতিটি মডিউলের build.gradle-এর নির্বাহ।
ঐতিহাসিকভাবে, settings.gradle Gradle 0.7 (2010)-এ উপস্থিত হয়েছিল এবং শুরুতে শুধুমাত্র include নির্দেশ ছিল। Gradle-এর বিকাশের সাথে, pluginManagement (Gradle 6.8), dependencyResolutionManagement (Gradle 7.0) এবং versionCatalogs (Gradle 7.4) যোগ করা হয়েছিল। আধুনিক settings.gradle একটি শক্তিশালী কনফিগারেশন ফাইল যা পুরো প্রজেক্টের জন্য প্লাগইন, রিপোজিটরি এবং সংস্করণ ব্যবস্থাপনাকে কেন্দ্রীভূত করে। Google AGP 8.0 থেকে শুরু করে Android Gradle Plugin-এ এই ক্ষমতাগুলি প্রয়োগ করে।
settings.gradle প্রজেক্টের কাঠামো এবং বৈশ্বিক সেটিংস (প্লাগইন, রিপোজিটরি) পরিচালনা করে। build.gradle বিল্ড (নির্ভরতা, Android কনফিগারেশন, কাজ) পরিচালনা করে। settings.gradle প্রথমে নির্বাহিত হয় এবং Settings API-তে অ্যাক্সেস রাখে। build.gradle পরে নির্বাহিত হয় এবং Project API-তে অ্যাক্সেস রাখে। কোনো মডিউল-স্তরের কনফিগারেশন (android ব্লক, dependencies) settings.gradle-এ থাকতে পারে না — সেটি একটি ত্রুটি হবে।
include নির্দেশটি settings.gradle-এর মূল। এটি Gradle-কে বলে কোন মডিউলগুলি বিল্ডে অংশ নেওয়া উচিত। include-এর আর্গুমেন্ট হল মডিউল পাথ সহ একটি স্ট্রিং: include(":app") রুট স্তরে একটি মডিউল অন্তর্ভুক্ত করে, include(":core:network") core/network/ উপডিরেক্টরিতে একটি মডিউল অন্তর্ভুক্ত করে। শুরুতে কোলন নির্দেশ করে যে পাথটি প্রজেক্ট রুটের সাপেক্ষে। include-এর পরে, Gradl স্বয়ংক্রিয়ভাবে নির্দিষ্ট ডিরেক্টরিতে build.gradle খুঁজে পায় এবং মডিউলটি প্রজেক্ট ট্রিতে যোগ করে।
প্রতিটি include Gradle API-তে একটি Project তৈরি করে যার নাম include স্ট্রিংয়ের সমান। প্রজেক্টের নাম অন্যান্য মডিউলের build.gradle ফাইলে implementation(project(":module"))-এ ব্যবহার করা হয়। যদি কোনো মডিউল include-এর মাধ্যমে অন্তর্ভুক্ত না হয়, তাহলে অন্য মডিউল থেকে এটি উল্লেখ করলে “Project not found” ত্রুটি হবে। Android Studio IDEও Project প্যানেলে মডিউল প্রদর্শনের জন্য settings.gradle ব্যবহার করে — include ছাড়া মডিউল ফাইল ট্রিতে দৃশ্যমান হয় না।
include includeBuild("../library-project")-এর মাধ্যমে included builds এবং composite builds সমর্থন করে। এটি সম্পূর্ণ Gradle প্রকল্পকে বাহ্যিক মডিউল হিসাবে অন্তর্ভুক্ত করার অনুমতি দেয়। Included builds অ্যাপ্লিকেশনের সাথে সমান্তরালে লাইব্রেরি বিকাশের জন্য উপযোগী: লাইব্রেরির পরিবর্তনগুলি Maven রিপোজিটরিতে প্রকাশ না করেই তাত্ক্ষণিকভাবে অ্যাপ্লিকেশনে দৃশ্যমান হয়। প্রোডাকশন বিল্ডে, includeBuild একটি সাধারণ Maven নির্ভরতা দ্বারা প্রতিস্থাপিত হয়।
// settings.gradle.kts — সাধারণ কাঠামো
rootProject.name = "MyApp"
// অ্যাপ্লিকেশন মডিউল
include(":app")
include(":core:network")
include(":core:database")
include(":core:ui")
include(":feature:home")
include(":feature:profile")
include(":feature:settings")
// বাহ্যিক লাইব্রেরি অন্তর্ভুক্ত করা (composite build)
includeBuild("../my-analytics-lib") {
dependencySubstitution {
substitute(module("com.example:analytics"))
.using(project(":analytics"))
}
}
pluginManagement settings.gradle-এর একটি ব্লক যা নির্ধারণ করে কোথায় Gradle প্লাগইন লোড করতে হবে। এটি Gradle 6.8-এ প্রয়োগের আগে কেন্দ্রীভূত প্লাগইন ব্যবস্থাপনার জন্য উপস্থিত হয়েছিল। pluginManagement-এর ভিতরে রয়েছে: repositories (প্লাগইন খোঁজার জন্য রিপোজিটরির তালিকা), resolutionStrategy (সংস্করণ সমাধানের নিয়ম) এবং plugins (স্পষ্ট প্লাগইন সংস্করণ ঘোষণা)। যদি pluginManagement সংজ্ঞায়িত না হয়, Gradle build.gradle থেকে রিপোজিটরি ব্যবহার করে — কিন্তু প্লাগইন ঘোষণা করার পরেই খোঁজা হয়, যা প্লাগইন না পাওয়া গেলে ত্রুটির দিকে নিয়ে যায়।
Android প্রজেক্টে, Version Catalogs বা Convention Plugins ব্যবহার করলে pluginManagement বাধ্যতামূলক। pluginManagement ছাড়া, Gradle build.gradle.kts-এ প্রয়োগ করার সময় com.android.application প্লাগইন খুঁজে পাবে না। একটি সাধারণ কনফিগারেশন: repositories-এ google() (Android প্লাগইন), mavenCentral() (তৃতীয়-পক্ষের প্লাগইন) এবং gradlePluginPortal() (অফিসিয়াল Gradle প্লাগইন) থাকে।
pluginManagement plugins-ও সমর্থন করে — সংস্করণ সহ প্লাগইন ঘোষণা করা যা পরে build.gradle-এ সংস্করণ উল্লেখ না করেই প্রয়োগ করা হয়। এটি প্লাগইন সংস্করণগুলিকে কেন্দ্রীভূত করে: যদি 10টি মডিউল kotlin-android প্রয়োগ করে, সংস্করণটি pluginManagement-এ একবার উল্লেখ করা হয়। গুরুত্বপূর্ণ: pluginManagement.plugins শুধুমাত্র একটি ঘোষণা। প্লাগইন নিজেই build.gradle-এ plugins { id("org.jetbrains.kotlin.android") }-এর মাধ্যমে প্রয়োগ করা হয়।
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
maven { url = "https://jitpack.io" }
}
// প্লাগইন সংস্করণ — কেন্দ্রীভূত
plugins {
id("com.android.application") version "8.7.0"
id("com.android.library") version "8.7.0"
id("org.jetbrains.kotlin.android") version "2.0.21"
id("com.google.devtools.ksp") version "2.0.21-1.0.25"
}
resolutionStrategy {
// সমস্ত মডিউলের জন্য বাধ্যতামূলক প্লাগইন সংস্করণ
eachPlugin {
if (requested.id.id == "com.google.gms.google-services") {
useVersion("4.4.2")
}
}
}
}
plugins {
// প্লাগইন প্রয়োগ করা — apply false (রুটে প্রয়োগ করবেন না)
id("com.android.application") apply false
id("org.jetbrains.kotlin.android") apply false
}
dependencyResolutionManagement settings.gradle-এর একটি ব্লক যা সমস্ত মডিউলের জন্য কেন্দ্রীয়ভাবে রিপোজিটরি পরিচালনা করে। এটি Gradle 7.0-এ প্রতিটি build.gradle-এ repositories ঘোষণার বিকল্প হিসাবে উপস্থিত হয়েছিল। ব্লকের ভিতরে repositoriesMode (মোড: PREFER_PROJECT, PREFER_SETTINGS বা FAIL_ON_PROJECT_REPOS) এবং repositories (রিপোজিটরির তালিকা) সেট করা হয়। যদি repositoriesMode = PREFER_SETTINGS হয়, মডিউল-স্তরের repositories উপেক্ষা করা হয় — শুধুমাত্র কেন্দ্রীভূত তালিকা ব্যবহার করা হয়।
repositoriesMode তিনটি মান নিতে পারে। PREFER_SETTINGS — build.gradle থেকে রিপোজিটরি উপেক্ষা করা হয়, শুধুমাত্র settings.gradle থেকে ব্যবহার করা হয়। PREFER_PROJECT — build.gradle রিপোজিটরির settings.gradle-এর উপর অগ্রাধিকার থাকে। FAIL_ON_PROJECT_REPOS — যদি কোনো মডিউল নিজস্ব রিপোজিটরি ঘোষণা করে, Gradle একটি ত্রুটি দেয়। নতুন প্রজেক্টের জন্য, PREFER_SETTINGS সুপারিশ করা হয় — এটি নিশ্চিত করে যে সমস্ত মডিউল একই রিপোজিটরি ব্যবহার করে এবং পুনরাবৃত্তি দূর করে।
repositoriesMode = FAIL_ON_PROJECT_REPOS বিশেষ করে টিমে উপযোগী: যদি একজন ডেভেলপার শুধুমাত্র একটি মডিউলে রিপোজিটরি যোগ করে এবং অন্যগুলি এটি না দেখে, তাহলে “works on my machine” সমস্যা তৈরি হয়। FAIL_ON_PROJECT_REPOS সমস্ত রিপোজিটরি settings.gradle-এ কেন্দ্রীয়ভাবে ঘোষণা করতে বাধ্য করে, এই ধরনের পরিস্থিতি প্রতিরোধ করে। Google AGP 8.0 থেকে শুরু করে সমস্ত Android প্রজেক্টের জন্য FAIL_ON_PROJECT_REPOS সুপারিশ করে।
dependencyResolutionManagement {
// FAIL_ON_PROJECT_REPOS — সমস্ত রিপোজিটরি শুধুমাত্র এখানে
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url = "https://jitpack.io" }
// প্রাইভেট Maven রিপোজিটরি
maven {
url = "https://maven.pkg.github.com/company/internal-lib"
credentials {
username = providers.gradleProperty("gpr.user")
.getOrNull() ?: System.getenv("GPR_USER") ?: ""
password = providers.gradleProperty("gpr.key")
.getOrNull() ?: System.getenv("GPR_KEY") ?: ""
}
}
}
}
// build.gradle মডিউলে repositories-এর আর প্রয়োজন নেই!
// সমস্ত রিপোজিটরি settings.gradle-এ কেন্দ্রীভূত
Version Catalogs TOML ফাইলের মাধ্যমে নির্ভরতা সংস্করণ পরিচালনার একটি কেন্দ্রীভূত উপায়। Gradle 7.4 থেকে শুরু করে, সংস্করণ ক্যাটালগ সমস্ত Android প্রজেক্টের জন্য সুপারিশকৃত প্রক্রিয়া। gradle/libs.versions.toml ফাইলে তিনটি বিভাগ রয়েছে: [versions] (সংস্করণ), [libraries] (নির্ভরতা), [plugins] (প্লাগইন)। settings.gradle-এ, সংস্করণ ক্যাটালগ @Suppress("UnstableApiUsage") এবং enableFeaturePreview("VERSION_CATALOGS") (পুরানো Gradle সংস্করণে) এর মাধ্যমে সংযুক্ত হয়।
সংস্করণ ক্যাটালগ সংযুক্ত করার পর, build.gradle-এ মডিউল নির্ভরতাগুলি libs-এর মাধ্যমে উল্লেখ করা হয়: implementation(libs.retrofit)। IDE libs-এর জন্য অটো-সম্পূর্ণতা প্রদান করে। ক্যাটালগ স্বয়ংক্রিয়ভাবে type-safe accessors তৈরি করে: libs.retrofit, libs.kotlin.coroutines, libs.bundles.compose। Bundles হল নির্ভরতার গ্রুপ যা একটি লাইনে অন্তর্ভুক্ত করা যায়। সংস্করণ ক্যাটালগ উত্তরাধিকারও সমর্থন করে — একাধিক TOML ফাইল সংযুক্ত করা যেতে পারে।
সংস্করণ ক্যাটালগের সুবিধা: সংস্করণের জন্য একক স্থান (সমস্ত build.gradle ফাইলে খোঁজার প্রয়োজন নেই); type-safe অ্যাক্সেস (libs নামে টাইপো কম্পাইলেশনে ধরা পড়ে, রানটাইমে নয়); স্বয়ংক্রিয় আপডেট (Dependabot এবং Renovate TOML সমর্থন করে); Convention Plugins-এর সাথে সামঞ্জস্য। Google Firebase এবং AndroidX তাদের নিজস্ব TOML ক্যাটালগ বিতরণ করে। Version Catalogs-এ মাইগ্রেট করার জন্য, প্লাগইন রয়েছে যা স্বয়ংক্রিয়ভাবে build.gradle থেকে TOML-এ সংস্করণ স্থানান্তর করে।
# gradle/libs.versions.toml
[versions]
agp = "8.7.0"
kotlin = "2.0.21"
composeBom = "2024.12.01"
retrofit = "2.11.0"
coroutines = "1.9.0"
[libraries]
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
retrofit-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
kotlin-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
compose-ui = { module = "androidx.compose.ui:ui" }
[bundles]
compose = ["compose-ui", "compose-material3"]
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
includeBuild একটি কম্পোজিট বিল্ড তৈরির নির্দেশ: বর্তমান বিল্ডের অংশ হিসাবে একটি বাহ্যিক Gradle প্রকল্প অন্তর্ভুক্ত করা। include (যা একটি মডিউল অন্তর্ভুক্ত করে) এর বিপরীতে, includeBuild নিজস্ব settings.gradle, মডিউল এবং প্লাগইন সহ একটি সম্পূর্ণ প্রকল্প অন্তর্ভুক্ত করে। কম্পোজিট বিল্ড ব্যবহার করা হয়: অ্যাপ্লিকেশনের সাথে সমান্তরালে লাইব্রেরি (অ্যানালিটিক্স, নেটওয়ার্কিং) বিকাশের জন্য; পৃথক রিপোজিটরি থেকে Convention Plugins অন্তর্ভুক্ত করার জন্য; build-logic মডিউল সংহত করার জন্য।
ইনকিউবেটিং বৈশিষ্ট্য (Incubating Features) Gradle-এর পরীক্ষামূলক বিকল্প যা enableFeaturePreview("FEATURE_NAME")-এর মাধ্যমে সক্রিয় হয়। AGP 8.7+-এ, উপলব্ধ বৈশিষ্ট্যগুলির মধ্যে রয়েছে: TYPESAFE_PROJECT_ACCESSORS (মাল্টি-মডিউল প্রজেক্টে প্রজেক্টে type-safe অ্যাক্সেস: project(":core:network")-এর পরিবর্তে, আপনি projects.core.network লিখতে পারেন), STABLE_CONFIGURATION_CACHE (স্থিতিশীল কনফিগারেশন ক্যাশিং), ARTIFACT_TRANSFORM_FOR_INTERNAL_TEST (আর্টিফ্যাক্ট রূপান্তর)। ইনকিউবেটিং বৈশিষ্ট্য প্রোডাকশনে সক্রিয় করা যেতে পারে, কিন্তু API ভবিষ্যতের সংস্করণে পরিবর্তিত হতে পারে।
Gradle Enterprise এবং Build Scanও settings.gradle-এর মাধ্যমে কনফিগার করা হয়: plugins { id("com.gradle.enterprise") } একটি gradleEnterprise ব্লকের সাথে। Build Scan একটি ক্লাউড পরিষেবা যা প্রতিটি বিল্ড সম্পর্কে বিস্তারিত তথ্য দেখায়: প্রতিটি কাজের নির্বাহ সময়, ক্যাশিং, ত্রুটি। Build Scan সক্রিয় করলে বিল্ড গতির সমস্যা নির্ণয় করতে সাহায্য করে। Build Scan ওপেন-সোর্স প্রজেক্টের জন্য বিনামূল্যে।
// ইনকিউবেটিং বৈশিষ্ট্য
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
enableFeaturePreview("STABLE_CONFIGURATION_CACHE")
// Gradle Enterprise / Build Scan
plugins {
id("com.gradle.enterprise") version "3.18"
}
gradleEnterprise {
buildScan {
termsOfServiceUrl = "https://gradle.com/terms-of-service"
termsOfServiceAgree = "yes"
publishAlwaysIf(true)
}
}
// build.gradle-এ type-safe project accessors ব্যবহার
// পরিবর্তে: implementation(project(":core:network"))
// আপনি করতে পারেন: implementation(projects.core.network)
সচরাচর জিজ্ঞাসিত প্রশ্ন
একক-মডিউল প্রজেক্টের জন্য, Gradle ডিফল্ট মান ব্যবহার করতে পারে। তবে, AGP 8+-এর জন্য, সর্বদা settings.gradle রাখার সুপারিশ করা হয়, কারণ Version Catalogs এবং Convention Plugins-এর সঠিক কার্যকারিতার জন্য pluginManagement এবং dependencyResolutionManagement বাধ্যতামূলক।
include বর্তমান প্রজেক্ট থেকে একটি মডিউল অন্তর্ভুক্ত করে (একক মডিউল ট্রি)। includeBuild একটি বাহ্যিক Gradle প্রকল্পকে কম্পোজিট বিল্ড হিসাবে অন্তর্ভুক্ত করে। includeBuild একই রিপোজিটরিতে লাইব্রেরি বিকাশ বা Convention Plugins অন্তর্ভুক্ত করার জন্য সুবিধাজনক।
settings.gradle-এ include(":মডিউল:নাম") যোগ করুন এবং build.gradle সহ একটি ডিরেক্টরি তৈরি করুন। Android Studio File → New → New Module-এর মাধ্যমে মডিউল তৈরি করার সময় এটি স্বয়ংক্রিয়ভাবে করে। যোগ করার পর, Sync Project with Gradle Files করুন।
না, pluginManagement একচেটিয়াভাবে settings.gradle-এর একটি ব্লক। এটি Initialization পর্যায়ে, কোনো build.gradle ফাইল নির্বাহের আগে কার্যকর করা হয়। build.gradle-এ, প্লাগইন শুধুমাত্র প্রয়োগ করা হয়, পরিচালিত হয় না।
প্রতিটি মডিউলকে নিজস্ব build.gradle-এ repositories ঘোষণা করতে হবে। এটি কোডের পুনরাবৃত্তি এবং ডিসিঙ্ক্রোনাইজেশনের ঝুঁকি তৈরি করে (একটি মডিউলে রিপোজিটরি আছে, অন্যটিতে নেই)। dependencyResolutionManagement রিপোজিটরি কেন্দ্রীভূত করে এবং “works on my machine” ত্রুটি প্রতিরোধ করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন