Tìm hiểu cơ bản về Gradle build tool

8 min read

Gradle là gì

Gradle là hệ thống xây dựng tự động mã nguồn mở được các nhà phát triển Java, Android và Kotlin lựa chọn, dựa trên các khái niệm về Apache Ant và Apache Maven và giới thiệu một ngôn ngữ dành riêng dựa trên Groovy thay vì XML form được sử dụng bởi Apache Maven để khai báo cấu hình dự án. Từ ứng dụng di động đến dịch vụ siêu nhỏ, từ các công ty khởi nghiệp nhỏ đến các doanh nghiệp lớn, nó giúp các nhóm cung cấp phần mềm tốt hơn, nhanh hơn.

Các khái niệm nên biết khi sử dụng Gradle

Dự án Gradle là một phần mềm có thể được xây dựng, chẳng hạn như  application library.

Single project bao gồm một dự án duy nhất được gọi là dự án gốc .

Multi-project bao gồm một dự án gốc và bất kỳ số lượng dự án con nào .

Build scripts
Xây dựng các tập lệnh chi tiết cho Gradle về các bước cần thực hiện để xây dựng dự án.

Mỗi dự án có thể bao gồm một hoặc nhiều tập lệnh xây dựng.

Dependency Management
Dependency Management là một kỹ thuật tự động để khai báo và giải quyết các tài nguyên bên ngoài mà một dự án yêu cầu.

Mỗi dự án thường bao gồm một số phụ thuộc bên ngoài mà Gradle sẽ giải quyết trong quá trình xây dựng.

Tasks
Tasks là đơn vị công việc cơ bản như biên dịch mã hoặc chạy thử nghiệm.

Mỗi dự án chứa một hoặc nhiều tác vụ được xác định bên trong một tập lệnh xây dựng hoặc một plugin.

Plugins
Các plugin được sử dụng để mở rộng khả năng của Gradle và tùy ý đóng góp các nhiệm vụ cho một dự án.

Cấu trúc dự án Gradle

Một dự án Gradle sẽ trông tương tự như sau:

project
├── gradle                              
│   ├── libs.versions.toml              
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew                             
├── gradlew.bat                         
├── settings.gradle(.kts)               
├── subproject-a
│   ├── build.gradle(.kts)              
│   └── src                             
└── subproject-b
    ├── build.gradle(.kts)              
    └── src

Thư mục Gradle để lưu trữ các tệp wrapper và nhiều hơn nữa
Danh mục phiên bản Gradle để quản lý sự phụ thuộc
Các tập lệnh bao bọc Gradle
Tệp cài đặt Gradle để xác định tên dự án gốc và các dự án con
Các tập lệnh xây dựng Gradle của hai dự án phụ – subproject-avàsubproject-b
Mã nguồn và/hoặc các tệp bổ sung cho các dự án

Gradle được tích hợp sẵn trong nhiều IDE bao gồm Android Studio, IntelliJ IDEA, Visual Studio Code, Eclipse và NetBeans.
Gradle có thể được tự động gọi khi bạn xây dựng, dọn dẹp hoặc chạy ứng dụng của mình trong IDE.

Các ưu điểm của gradle

  • Gradle kết hợp các ưu điểm của Ant và Maven đồng thời đem lại các cải thiện mới thông qua việc sử dụng Groovy (một trong những ngôn ngữ JVM) trong việc giải quyết bài toán đóng gói. Nhờ vậy build script viết bằng Gradle trở nên ngắn gọn và trực quan dễ đọc hơn.
  • Hiệu suất cao:
    • Incremental Builds: Gradle hỗ trợ build gia tăng, nghĩa là nó chỉ build lại những phần đã thay đổi, giúp tiết kiệm thời gian và tài nguyên.
    • Build Cache: Gradle có thể lưu trữ và tái sử dụng kết quả của các build trước đó, giảm thiểu thời gian build khi không có nhiều thay đổi.
    • Parallel Execution: Gradle có khả năng thực hiện các tác vụ song song, tận dụng tối đa tài nguyên hệ thống và tăng tốc độ build.
  • Khả năng mở rộng và linh hoạt:
    • Ngôn ngữ Groovy và Kotlin: Gradle sử dụng Groovy và Kotlin làm ngôn ngữ script, cung cấp sự linh hoạt cao trong việc viết các build script.
    • Tùy chỉnh cao: Gradle hỗ trợ build cho nhiều ngôn ngữ lập trình khác nhau bao gồm Java, Scala, Python, C/C++, Android, iOS. Bạn có thể dễ dàng mở rộng và tùy chỉnh build script để phù hợp với nhu cầu cụ thể của dự án.
  • Hệ sinh thái plugin phong phú:
    • Gradle có sẵn nhiều plugin cho các công cụ và khung công tác phổ biến như Java, Android, Scala, Groovy, và nhiều ngôn ngữ lập trình khác. Điều này giúp đơn giản hóa việc tích hợp với các công cụ và công nghệ khác.
  • Khả năng tích hợp tốt:
    • Gradle có thể tích hợp tốt với các hệ thống quản lý phiên bản như Git, cũng như các công cụ CI/CD như Jenkins, Travis CI, CircleCI, giúp tối ưu hóa quy trình phát triển và triển khai.
  • Hỗ trợ tốt cho phát triển đa dự án:
    • Gradle hỗ trợ tốt cho việc quản lý các dự án đa module (multi-project builds), giúp bạn tổ chức và quản lý các dự án phức tạp một cách dễ dàng.
  • Cộng đồng và tài liệu phong phú:
    • Gradle có một cộng đồng người dùng và phát triển đông đảo, cùng với tài liệu phong phú và chi tiết, giúp bạn dễ dàng tìm kiếm giải pháp cho các vấn đề gặp phải.

Nhờ các ưu điểm trên, Gradle đã trở thành một công cụ build được ưa chuộng trong cộng đồng phát triển phần mềm, đặc biệt là trong các dự án lớn và phức tạp.

Gradle vs Maven

Gradle và Maven là hai công cụ build phổ biến được sử dụng trong phát triển phần mềm Java và các ngôn ngữ lập trình khác.

Gradle và Maven về cơ bản khác nhau về cách tiếp cận xây dựng. Gradle hoạt động dựa trên biểu đồ phụ thuộc nhiệm vụ, với các nhiệm vụ thực hiện công việc. Ngược lại, Maven áp dụng mô hình cố định, tuyến tính của các giai đoạn, chỉ định mục tiêu cho các giai đoạn dự án

  • Hiệu suất: Tốc độ và Hiệu quả:
    • Cả Gradle và Maven đều hỗ trợ thực thi song song các bản dựng đa mô-đun. Tuy nhiên, Gradle nổi bật với việc sử dụng các bản dựng gia tăng. Nó đạt được điều này bằng cách kiểm tra trạng thái của các tác vụ và bỏ qua bất kỳ tác vụ nào không được cập nhật, dẫn đến thời gian dựng ngắn hơn. 
  • Quản lý sự phụ thuộc: Tính linh hoạt và khả năng tương thích
    • Cả Gradle và Maven đều xử lý tốt các phụ thuộc động và phụ thuộc gián tiếp, sử dụng bộ đệm phụ thuộc của bên thứ ba và đọc định dạng siêu dữ liệu POM. Chúng cũng có thể khai báo các phiên bản thư viện thông qua định nghĩa phiên bản trung tâm và thực thi định nghĩa đó. Mỗi loại có thể tải xuống các phụ thuộc gián tiếp từ kho lưu trữ hiện vật của chúng, Maven từ Maven Central và Gradle từ JCenter. Cả hai đều hỗ trợ định nghĩa về kho lưu trữ công ty riêng. Nếu một dự án yêu cầu nhiều phụ thuộc, Maven có thể tải xuống các phụ thuộc này đồng thời.
    • Mặc dù có những điểm tương đồng này, Gradle vẫn vượt trội hơn Maven ở các lĩnh vực như API và phụ thuộc triển khai, và bộ đệm an toàn đồng thời. Gradle bảo toàn siêu dữ liệu kho lưu trữ với các phụ thuộc được lưu trong bộ đệm, ngăn chặn ghi đè khi nhiều dự án sử dụng cùng một bộ đệm. Nó cũng có bộ đệm dựa trên tổng kiểm tra và đồng bộ hóa bộ đệm với kho lưu trữ. Hơn nữa, Gradle hỗ trợ Siêu dữ liệu IVY, cho phép các quy tắc tùy chỉnh cho các phụ thuộc động và giải quyết xung đột phiên bản, không giống như Maven.
  • Các tính năng độc quyền của Gradle bao gồm:
    • Quy tắc thay thế cho các thư viện tương thích
    • Ứng dụng của quy tắc ReplacedBy
    • Độ phân giải siêu dữ liệu nâng cao
    • Khả năng thay thế linh hoạt các phụ thuộc của dự án bằng các phụ thuộc bên ngoài và ngược lại

Cả Gradle và Maven đều cung cấp các nhóm tác vụ và mô tả và chỉ có thể xây dựng dự án được chỉ định và các phụ thuộc của nó. Tuy nhiên, Gradle sử dụng DAG có thể cấu hình đầy đủ, trong khi Maven chỉ cho phép đính kèm một mục tiêu vào một mục tiêu khác. Gradle cũng hỗ trợ loại trừ tác vụ, loại trừ bắc cầu, suy luận phụ thuộc tác vụ, sắp xếp tác vụ nâng cao và trình hoàn thiện.

Cấu hình dependencies

Mỗi dependency được khai báo cho một dự án Gradle đều áp dụng cho một phạm vi cụ thể. Ví dụ, một số dependency nên được sử dụng để biên dịch mã nguồn trong khi những dependency khác chỉ cần có sẵn khi chạy. Gradle biểu diễn phạm vi của dependency với sự trợ giúp của Configuration 
Mỗi configuration có thể được xác định bằng một tên duy nhất.

Nhiều plugin Gradle thêm các cấu hình được xác định trước vào dự án của bạn. Ví dụ, plugin Java thêm các cấu hình để biểu diễn các classpath khác nhau cần thiết cho việc biên dịch mã nguồn, thực hiện các bài kiểm tra, v.v.

Trong Gradle, bạn cấu hình dependencies trong file build.gradle. Dưới đây là một ví dụ về cách cấu hình dependencies:

plugins {
  id 'java'
}
repositories {
  mavenCentral()
}
dependencies {
  // Dependency cho JUnit testing framework
  testImplementation 'junit:junit:4.13.2'
  // Dependency cho Apache Commons Lang library
  implementation 'org.apache.commons:commons-lang3:3.12.0'

  // Dependency cho Spring framework
  implementation 'org.springframework:spring-core:5.3.9'
}

Gradle là một công cụ build mạnh mẽ, linh hoạt và hiệu quả, phù hợp cho cả các dự án nhỏ và các dự án lớn, phức tạp. Với khả năng tùy chỉnh cao, hỗ trợ tốt cho phát triển đa dự án, và tích hợp mạnh mẽ với các công cụ và môi trường phát triển, Gradle đã trở thành lựa chọn hàng đầu cho nhiều đội ngũ phát triển phần mềm.

Tham khảo https://docs.gradle.org/current/userguide/gradle_basics.html?

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *