گریدل

**گریدل** (به انگلیسی: Gradle)، یک ابزار متن‌باز اتوماسیون ساخت (build automation) است که فرایند توسعه را از مرحله جمع‌آوری و آزمایش تا استقرار و انتشار کنترل می‌کند.

اپلیکیشن‌های امروزی برای مثال یک اپلیکیشن اندروید از نظر ساختاری به سادگی اپلیکیشن‌های پانزده سال پیش نیستند. در گذشته کدهای برنامه توسط برنامه‌نویس نوشته می‌شد و پس از کامپایل شدن اجرا می‌شد. اما امروزه یک برنامه‌نویس قبل از اجرای برنامه نیاز به انجام عملیات متنوع و متعددی برای ساخت فایل‌های اجرایی برنامه دارد. برای مثال بررسی خطاهای نوشتاری برنامه قبل از کامپایل، قرار گرفتن فایل‌های media برنام هر کدام به مسیر از پیش تعیین شده انتقال داده شوند. مجموعه ای از کدها به صورت خودکار و پویا با توجه به کدهای نوشته شده توسط برنامه‌نویس ساخته شوند و در کنار کدهای برنامه‌نویس قرار بگیرند. تست‌های نوشته شده توسط برنامه‌نویس اجرا شود و نتیجه آن اعلام شود. در آخر همه فایل‌های مورد نیاز به همراه کدهای کامپایل شده برنامه درون یک فایل قرار گیرد. بعد از همه این عملیات و ساخته شدن فایل خروجی حالا می‌توان آن را نصب کرد. نکته مهم و قابل توجه این است که برنامه‌نویس پس از هر بار تغییر در برنامه برای اجرای مجدد باید این عملیات را تکرار کند. به این عملیات عملیات ساخت گفته می‌شود. زیاد بودن، زمان بر بودن، پیچیدگی و تنوع مراحل ساخت باعث شده‌است که برنامه نویسان دست به ساخت سیستم‌های ساخت اتوماتیک نظیر Gradle بزنند.

## تاریخچه
گریدل برای اولین بار توسط هنس داکتر (Hans Dockter) با هدف جایگزینی ابزارهایی مانند Ant و Maven ایجاد شد. گریدل تلاش می‌کند که مشکلات و محدودیت‌های ابزارهای قبلی را حل کند. نسخه اولیه گریدل از زبان Groovy برای تعریف اسکریپت‌های ساخت استفاده می‌کرد. در سال‌های اخیر، Gradle پشتیبانی از زبان Kotlin را نیز برای تعریف اسکریپت‌ها اضافه کرده است.

با رشد سریع توسعه نرم‌افزارهای موبایلی و به‌ویژه اندروید، گریدل در ابزارهایی مانند **اندروید استودیو** نقش کلیدی پیدا کرد.

## نام
واژه Gradle را شخص بنیان‌گذار آن، هنس داکتر (Hans Dockter)، انتخاب کرده‌است و معنی خاصی ندارد و تنها دلیل آقای هنس از انتخاب این کلمه، تلفظ راحت آن است.

## ویژگی‌های کلیدی

### انعطاف‌پذیری بالا:
گریدل به کاربران اجازه می‌دهد اسکریپت‌های ساخت را به صورت کاملاً سفارشی تعریف کنند. این ویژگی باعث می‌شود برای پروژه‌هایی با پیچیدگی بالا مناسب باشد.

### مدیریت وابستگی‌ها:
گریدل از سیستم مدیریت وابستگی پیشرفته‌ای استفاده می‌کند که امکان مدیریت کتابخانه‌ها و ماژول‌های خارجی را ساده می‌کند. این سیستم مبتنی بر مخازن مانند Maven و Ivy است.

### پشتیبانی از زبان‌های چندگانه:
گریدل از زبان‌های برنامه‌نویسی مختلف مانند جاوا، کاتلین، گرووی، اسکالا، C/C++ و جاوا اسکریپت پشتیبانی می‌کند.

### Build Cache:
گریدل با استفاده از حافظه پنهان (Build Cache) سرعت ساخت پروژه‌ها را افزایش می‌دهد و از انجام مجدد عملیات‌های غیرضروری جلوگیری می‌کند.

### پلاگین‌ها:
گریدل با استفاده از پلاگین‌ها قابلیت‌های خود را گسترش می‌دهد. برخی از پلاگین‌های معروف شامل پلاگین اندروید، جاوا، و C/C++ هستند.

## نحوه کار گریدل
**گریدل** از یک مفهوم پیشرفته به نام **گراف وظایف (Task Graph)** برای مدیریت فرآیند ساخت استفاده می‌کند. این گراف نمایشی است از تمام وظایفی (Tasks) که در یک پروژه تعریف شده‌اند، و ارتباطات و وابستگی‌های بین این وظایف را مشخص می‌کند. گریدل با استفاده از این گراف وظایف، فرآیند ساخت را بهینه کرده و تنها وظایف ضروری را اجرا می‌کند.

#### مراحل کار گریدل در اجرای گراف وظایف:
**۱- Initialization Phase (مرحله آغازین):**

در این مرحله، گریدل پروژه را شناسایی کرده و محیط اجرای آن را تنظیم می‌کند. این شامل شناسایی فایل‌های ساخت مانند `build.gradle` یا `build.gradle.kts` است. گریدل همچنین وابستگی‌های بین ماژول‌ها و پروژه‌ها را بررسی می‌کند.

##### '''۲- Configuration Phase (مرحله پیکربندی):'''
گریدل تمام وظایفی که باید اجرا شوند را تحلیل و گراف وظایف را ایجاد می‌کند.

* در این مرحله، تمامی وظایف پروژه به همراه وابستگی‌هایشان مشخص می‌شوند.
* وابستگی‌ها مشخص می‌کنند که کدام وظایف باید پیش از اجرای وظایف دیگر انجام شوند.
* برای مثال، اگر یک وظیفه به نام `compileJava` وابسته به وظیفه `processResources` باشد، ابتدا `processResources` اجرا می‌شود.

##### '''۳- Execution Phase (مرحله اجرا):'''
گریدل گراف وظایف را اجرا می‌کند، اما تنها وظایفی که واقعاً نیاز به اجرا دارند انجام می‌شوند.

* اگر خروجی یک وظیفه از قبل وجود داشته باشد و تغییری در ورودی‌های آن وظیفه رخ نداده باشد، گریدل از **حافظه پنهان (Build Cache)** استفاده کرده و آن وظیفه را مجدداً اجرا نمی‌کند.
* این رویکرد به شدت زمان ساخت پروژه را کاهش می‌دهد.

#### چرا گراف وظایف در گریدل اهمیت دارد؟

##### '''اجرای موازی (Parallel Execution):'''
گریدل می‌تواند وظایف مستقل را به‌صورت موازی اجرا کند، که باعث افزایش کارایی در پروژه‌های بزرگ می‌شود.

##### '''حذف وظایف غیرضروری:'''
گریدل تنها وظایفی را اجرا می‌کند که خروجی آنها در فرآیند ساخت مورد نیاز است. این ویژگی باعث کاهش زمان اجرای پروژه می‌شود. برای مثال، اگر تغییری در کد منبع یک ماژول رخ نداده باشد، وظایف مرتبط با کامپایل آن ماژول اجرا نمی‌شوند.

##### '''استفاده از ورودی و خروجی وظایف:'''
هر وظیفه در گریدل دارای ورودی (Input) و خروجی (Output) است. گریدل با بررسی تغییرات در ورودی‌ها تصمیم می‌گیرد که آیا وظیفه‌ای باید اجرا شود یا خیر.

#### مثال:
فرض کنید پروژه‌ای شامل وظایف زیر باشد:

* `clean`: حذف فایل‌های موقتی
* `compileJava`: کامپایل کدهای جاوا
* `processResources`: پردازش منابع پروژه
* `build`: ترکیب وظایف مختلف برای ایجاد خروجی نهایی

اگر هیچ تغییری در فایل‌های منبع رخ نداده باشد، گریدل می‌تواند از حافظه پنهان برای تولید فایل‌های خروجی استفاده کرده و تنها وظایف ضروری را اجرا کند.

#### مزایای استفاده از گراف وظایف:

# **بهینه‌سازی زمان ساخت:**  با حذف وظایف غیرضروری، زمان ساخت پروژه کاهش می‌یابد.
# **کاهش خطا:**  با مدیریت دقیق وابستگی‌ها، گریدل تضمین می‌کند که تمام وظایف به ترتیب صحیح اجرا شوند.
# **پشتیبانی از پروژه‌های بزرگ:**  گریدل به خوبی با پروژه‌هایی که شامل تعداد زیادی ماژول و وابستگی‌های پیچیده هستند سازگار است.

## مقایسه گریدل با دیگر ابزارها

### '''Ant:'''
Ant یک ابزار قدیمی است که برای مدیریت ساخت پروژه‌های جاوا طراحی شده بود. اما انعطاف‌پذیری کمتری نسبت به گریدل دارد.

### '''Maven:'''
Maven یک ابزار ساخت محبوب دیگر است که از XML برای تعریف اسکریپت‌ها استفاده می‌کند. برخلاف Maven، گریدل از DSL مبتنی بر Groovy یا Kotlin استفاده می‌کند که خوانایی بیشتری دارد.

### '''Bazel:'''
Bazel توسط گوگل توسعه یافته و تمرکز آن بر ساخت سریع پروژه‌های بزرگ است. گریدل انعطاف‌پذیری بیشتری نسبت به Bazel دارد.

## کاربرد گریدل در اندروید
گریدل به‌طور گسترده در توسعه اپلیکیشن‌های اندروید استفاده می‌شود. این ابزار به توسعه‌دهندگان امکان می‌دهد که وابستگی‌ها، منابع و ماژول‌های مختلف پروژه را به‌صورت یکپارچه مدیریت کنند. **اندروید استودیو**، به‌عنوان IDE رسمی توسعه اندروید، از گریدل به‌عنوان ابزار پیش‌فرض ساخت استفاده می‌کند.

## گریدل در توسعه اپلیکیشن‌های اندروید
**گریدل** به دلیل قابلیت‌ها و انعطاف‌پذیری بالا، به ابزار اصلی برای مدیریت فرآیند ساخت در **توسعه اپلیکیشن‌های اندروید** تبدیل شده است. این ابزار به توسعه‌دهندگان امکان می‌دهد تا وابستگی‌ها، منابع، و ماژول‌های مختلف پروژه را به شکل مؤثر و یکپارچه مدیریت کنند. همچنین، گریدل تمامی فرآیندهای پیچیده مربوط به کامپایل، تست، و تولید خروجی‌های نهایی را به‌طور خودکار انجام می‌دهد.

#### نقش گریدل در اندروید استودیو
اندروید استودیو، IDE رسمی گوگل برای توسعه اندروید، از گریدل به‌عنوان ابزار پیش‌فرض ساخت استفاده می‌کند. گریدل در این محیط نقش‌های متعددی را ایفا می‌کند:

##### '''مدیریت وابستگی‌ها (Dependency Management):'''

* گریدل به توسعه‌دهندگان این امکان را می‌دهد که به‌راحتی وابستگی‌های پروژه مانند کتابخانه‌ها و پلاگین‌ها را مدیریت کنند.
* وابستگی‌ها به‌صورت خودکار دانلود و به پروژه اضافه می‌شوند.
* فایل `build.gradle` به توسعه‌دهندگان این اجازه را می‌دهد که نسخه کتابخانه‌ها را تعریف کرده و در صورت نیاز به‌روزرسانی کنند.

مثال:

###### '''پشتیبانی از چند ماژول (Multi-Module Support):'''

* گریدل امکان تقسیم پروژه به چندین ماژول جداگانه را فراهم می‌کند، که هر ماژول می‌تواند شامل کد منبع، منابع، و تست‌های مخصوص به خود باشد.
* این ساختار باعث می‌شود که مدیریت پروژه‌های بزرگ ساده‌تر و کارآمدتر شود.

###### '''ایجاد انواع نسخه‌های مختلف (Build Variants):'''

* گریدل به توسعه‌دهندگان این امکان را می‌دهد که نسخه‌های مختلفی از اپلیکیشن مانند **Debug**، **Release** یا نسخه‌هایی برای بازارهای خاص ایجاد کنند.
* این ویژگی از طریق فایل `build.gradle` پیکربندی می‌شود و توسعه‌دهندگان می‌توانند تنظیمات مختلفی مانند بهینه‌سازی کد و امضای دیجیتال را برای هر نسخه تعریف کنند.

مثال:

# **اتصال به سیستم‌های CI/CD:**
#* گریدل به‌طور یکپارچه با سیستم‌های **توسعه مداوم (Continuous Integration)** و **انتشار مداوم (Continuous Delivery)** مانند Jenkins، GitLab CI، و GitHub Actions سازگار است.
#* این ویژگی کمک می‌کند که فرآیند ساخت و تست پروژه به‌صورت خودکار و مداوم انجام شود.

#### ویژگی‌های گریدل که توسعه اپلیکیشن اندروید را ساده‌تر می‌کنند:

```kotlin
plugins {
    id 'com.android.application'
}
```


##### '''پشتیبانی از پلاگین‌های اندروید:'''

* گریدل از پلاگین‌های متعددی پشتیبانی می‌کند که برای ساخت و بهینه‌سازی پروژه‌های اندرویدی طراحی شده‌اند.
* مهم‌ترین پلاگین مورد استفاده در پروژه‌های اندروید، پلاگین `com.android.application` است.

مثال:

###### '''پیکربندی پویا:'''

* گریدل امکان پیکربندی پویا را از طریق زبان‌های برنامه‌نویسی **Groovy** یا **Kotlin DSL** فراهم می‌کند. این ویژگی به توسعه‌دهندگان اجازه می‌دهد که تنظیمات خاصی مانند تغییر مسیر منابع یا اضافه کردن وظایف سفارشی را به پروژه اضافه کنند.

###### '''حافظه پنهان ساخت (Build Cache):'''

* گریدل از یک سیستم **حافظه پنهان هوشمند** برای ذخیره خروجی وظایف استفاده می‌کند. این سیستم باعث می‌شود که در ساخت‌های بعدی، وظایف تکراری مجدداً اجرا نشوند و زمان ساخت کاهش یابد.

###### پشتیبانی از تست خودکار:

* گریدل به توسعه‌دهندگان این امکان را می‌دهد که تست‌های واحد (Unit Tests) و تست‌های رابط کاربری (UI Tests) را به‌صورت خودکار اجرا کنند.
* ابزارهای تست مانند JUnit و Espresso به‌راحتی با گریدل یکپارچه می‌شوند.

## معماری گریدل
گریدل از معماری **Master/Worker** استفاده می‌کند. در این معماری، یک فرآیند اصلی وظایف را مدیریت کرده و آنها را بین فرآیندهای کاری توزیع می‌کند. این رویکرد باعث افزایش کارایی و سرعت اجرای وظایف می‌شود.

## مزایا و معایب

#### مزایا:

* انعطاف‌پذیری بالا
* سرعت بالا با استفاده از Build Cache
* قابلیت مدیریت پیچیده‌ترین پروژه‌ها
* پشتیبانی از پلاگین‌های متعدد

#### معایب:

* منحنی یادگیری بالا برای تازه‌کارها
* نیاز به منابع سیستمی بیشتر نسبت به ابزارهایی مانند Ant

## منابع آموزشی

# مستندات رسمی گریدل
# آموزش گریدل در اندروید استودیو
# کتاب‌های گریدل

## زبان‌های پشتیبانی شده

* جاوا (کاتلین، گرووی، اسکالا)
* C/C++
* جاوا اسکریپت

## توزیع
گریدل برای دانلود جداگانه در دسترس است، ولی میتوان آن را در محصولاتی مانند اندروید استودیو نیز یافت.

## منابع


## پیوند به بیرون

* 

## منابع

رده:ابزارهای توسعه جاوا
رده:ابزارهای مرتبط با کامپایل کردن
رده:خودکارسازی ساخت
رده:نرم‌افزارهای چندسکویی
رده:نرم‌افزارهای ۲۰۰۷ (میلادی)
رده:نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند