JavaRush /Blog Java /Random-VI /Giới thiệu nhanh về Gradle
Viacheslav
Mức độ

Giới thiệu nhanh về Gradle

Xuất bản trong nhóm

Giới thiệu

Chủ đề của bài đánh giá này sẽ là hệ thống xây dựng tự động Gradle. Trong tiếng Anh, hệ thống xây dựng được gọi là Build Tools . Giới thiệu nhanh về Gradle - 1Tại sao điều này lại cần thiết? Xây dựng dự án bằng Java theo cách thủ công là một quá trình khá tốn công sức. Cần phải chỉ ra chính xác các thư viện và framework mà dự án cần và dự án phụ thuộc vào những gì. Tại đây bạn có thể đọc một bài viết xuất sắc về Habré: “ Làm việc với Java trên dòng lệnh .” Sớm hay muộn bạn sẽ bắt đầu tạo một số tập lệnh để tự động hóa quá trình này. Bây giờ hãy tưởng tượng rằng tất cả các nhà phát triển trên khắp thế giới đều làm điều này và mọi người viết lại những gì ai đó đã viết cho dự án của họ. Và sau đó các hệ thống lắp ráp dự án xuất hiện tự động hóa quá trình này. Ngoài ra, một mặt, họ cho phép bạn tập hợp một dự án theo cách bạn muốn, mặt khác, họ cung cấp cho bạn các công cụ được tiêu chuẩn hóa ít nhiều. Một giải pháp thay thế cho Gradle là hệ thống xây dựng tự động Maven. Hai hệ thống lắp ráp này một mặt khác nhau nhưng mặt khác chúng có một số điểm tương đồng. Có tài liệu về chủ đề này trên trang web Gradle: " Di chuyển từ Maven sang Gradle ". Như đã nêu trong hướng dẫn này, Gradle và Maven có quan điểm khác về cách xây dựng một dự án. Gradle dựa trên biểu đồ nhiệm vụ, các nhiệm vụ này có thể phụ thuộc lẫn nhau. Nhiệm vụ thực hiện một số loại công việc. Maven sử dụng một mô hình gồm các giai đoạn nhất định, gắn liền với những “mục tiêu” nhất định. Những mục tiêu này là nơi một số công việc được thực hiện. Tuy nhiên, với những cách tiếp cận khác nhau này, cả hai hệ thống xây dựng đều tuân theo cùng một quy ước và việc quản lý sự phụ thuộc cũng tương tự nhau. Để bắt đầu sử dụng Gradle, bạn cần tải xuống. Trong Google hoặc Yandex, chúng tôi nhập “Công cụ xây dựng Gradle” và trong kết quả đầu tiên, chúng tôi thấy trang web chính thức: https://gradle.org . Trên trang Gradle chính có một liên kết có nội dung "Docs", dẫn đến tài liệu Gradle . Đầu tiên, chúng ta cần cài đặt (Install) Gradle, vì vậy chúng ta quan tâm đến phần " Installing Gradle " của tài liệu. Có nhiều phương pháp cài đặt, bao gồm cả phương pháp “lỗi thời”, tức là. thủ công (“ Cài đặt thủ công ”). Theo hướng dẫn, hãy tải xuống một tệp thuộc loại “ chỉ nhị phân ”, tệp này sẽ có tên như gradle-5.1.1-bin.zip. Tiếp theo, giải nén kho lưu trữ và định cấu hình biến môi trường PATH theo hướng dẫn. Điều chính là sau khi thực hiện các hướng dẫn, lệnh gradle -vsẽ hiển thị phiên bản Gradle đã cài đặt. Có thể xảy ra vấn đề là khi xác định vị trí, hệ thống sẽ tìm thấy Gradle không ở nơi bạn mong muốn. Do đó, trên Windows bạn có thể làm (trên *nix có những điều tương tự): for %i in (gradle.bat) do @echo. %~$PATH:i Bây giờ, có lẽ, chúng ta có thể bắt đầu làm quen.
Giới thiệu nhanh về Gradle - 2

Khởi tạo dự án Gradle

Tôi muốn lưu ý ngay rằng Gradle nói về việc thực hiện các nhiệm vụ được gọi là nhiệm vụ (tôi sẽ gọi chúng là nhiệm vụ). Nhiệm vụ được cung cấp bởi các plugin khác nhau . Tôi khuyên bạn nên đọc thêm về plugin trong tài liệu chính thức: " Sử dụng Plugin Gradle ". Có một bộ "Core Plugin" luôn có sẵn khi cài đặt Gradle. Có nhiều danh mục khác nhau của các plugin này, nhưng chúng tôi quan tâm đến danh mục " Tiện ích ". Bộ này bao gồm plugin " Build init Plugin ", cung cấp các tác vụ để khởi tạo dự án Gradle. Chúng tôi quan tâm đến việc tạo một loại dự án: " ứng dụng java ". Hãy chạy tác vụ Gradle: gradle init --type java-application Hãy trả lời một số câu hỏi trong quá trình thực hiện, ví dụ: rằng chúng ta muốn sử dụng Groovy DSL (ngôn ngữ mô tả tác vụ tiêu chuẩn cho Gradle) và khung kiểm tra JUnit (chúng ta sẽ nói về vấn đề này trong bài đánh giá khác). Sau khi tạo xong chúng ta sẽ nhận được bộ file sau:
Giới thiệu nhanh về Gradle - 3
Đầu tiên, sau khi khởi tạo, chúng tôi nhận được một trình bao bọc đặc biệt được định cấu hình sẵn cho phiên bản Gradle của chúng tôi - đây là một tập lệnh đặc biệt. Tôi khuyên bạn nên đọc thêm về nó trong tài liệu chính thức - “ The Gradle Wrapper ”. Thứ hai, chúng ta thấy Gradle Build Script - tệp build.gradle. Đây là tệp chính mô tả những thư viện và khung mà dự án của chúng tôi sử dụng, những plugin nào cần được kết nối với dự án và mô tả các tác vụ khác nhau. Tôi khuyên bạn nên đọc thêm về tệp này trong tài liệu chính thức: " Build Script Basics ".
Giới thiệu nhanh về Gradle - 4

Plugin và nhiệm vụ

Bây giờ nếu nhìn vào nội dung của Build Script chúng ta sẽ thấy phần plugin:
plugins {
    id 'java'
    id 'application'
}
Đây là những plugin tương tự mà chúng ta đã nói đến trước đó. Và nếu có plugin thì sẽ có những nhiệm vụ hiện có sẵn cho chúng tôi. Chúng ta có thể chạy lệnh gradle task và xem bây giờ chúng ta có thể làm gì với dự án:
Giới thiệu nhanh về Gradle - 5
Ví dụ: bằng cách thực thi, gradle runchúng tôi sẽ khởi chạy lớp chính của ứng dụng java của mình:
Giới thiệu nhanh về Gradle - 6
Như chúng ta có thể thấy, điều tương tự cũng được viết dưới đây. 2 actionable tasks: 1 executed, 1 up-to-date Điều này có nghĩa là gì? Điều này có nghĩa là có tổng cộng 2 nhiệm vụ đã được hoàn thành: Hơn nữa, 1 nhiệm vụ đã thực sự hoàn thành và một nhiệm vụ chưa được thực hiện, bởi vì... nó được cập nhật, nghĩa là trạng thái hiện tại và chưa có gì được thực hiện. Chúng ta có thể thực thi cái gọi là "Dry Run": gradle run -m Hãy thực hiện lệnh này, chúng ta sẽ xem những tác vụ nào sẽ được thực thi để thực thi tác vụ chạy:
Giới thiệu nhanh về Gradle - 7
Như chúng ta có thể thấy, có tổng cộng 4 nhiệm vụ đã được hoàn thành: trước khi thực thi lệnh chạy, nó đã thực thi các lớp nhiệm vụ phụ thuộc. Bản thân các lớp này có 2 phần phụ thuộc và do đó nó cũng thực thi buildJava và processResources. Khi thực hiện một tác vụ, chúng ta có thể thực hiện tác vụ đó trong khi xem một mức nhật ký nhất định (mức ghi nhật ký xác định mức độ quan trọng của các thông báo mà chúng ta muốn xem). Ví dụ, chúng ta có thể làm gradle run -i. Điều này cũng sẽ hiển thị cho chúng tôi các thông báo thông tin như:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
Để biết thêm thông tin về việc đăng nhập vào Gradle, tôi khuyên bạn nên tham khảo tài liệu chính thức: " Ghi nhật ký Gradle ". Như chúng ta có thể thấy, nhiệm vụ của lớp đã bị bỏ qua vì nó là UP-TO-DATE , nghĩa là trạng thái là hiện tại, không cần phải làm gì nên không có hành động nào. Điều này là do theo mặc định, Gradle có " Kiểm tra cập nhật " hay còn gọi là bản dựng tăng dần. Bạn có thể đọc thêm về cơ chế này trong tài liệu Gradle: " Kiểm tra cập nhật (AKA Incremental Build) ". Nhưng cơ chế này có thể bị vô hiệu hóa bằng cách thực thi một tác vụ chỉ định cờ --rerun-tasks. Ví dụ, gradle run --rerun-tasks. Sau đó, chúng ta sẽ thấy: 2 tác vụ có thể thực hiện: 2 tác vụ đã thực hiện Như bạn có thể thấy, số lượng tác vụ đã thực hiện chỉ tính đến cấp độ đầu tiên của biểu đồ, tức là chính tác vụ đang chạy và những tác vụ mà nó phụ thuộc trực tiếp, tức là , các lớp học. Các tác vụ mà lớp phụ thuộc vào không được tính ở đây (mặc dù chúng được thực thi khi tác vụ của lớp được thực thi). Bạn cũng nên đọc về các nhiệm vụ:
Giới thiệu nhanh về Gradle - 8

phụ thuộc

Một trong những nhiệm vụ chính của bất kỳ hệ thống xây dựng nào là quản lý các phần phụ thuộc, tức là xem thư viện/khuôn khổ nào mà dự án của chúng ta cần. Hệ thống xây dựng phải đảm bảo rằng chúng có sẵn vào đúng thời điểm và lắp ráp tạo phẩm cuối cùng của ứng dụng của chúng tôi theo đúng cách. Theo mặc định, sau gradle init cho ứng dụng java, chúng ta sẽ thấy nội dung sau trong tập lệnh xây dựng:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
Ở đây có thể thấy rõ ngay những gì chúng ta đang kết nối. Nhưng nếu không có chút hiểu biết thì không rõ triển khai và testImplementation là gì? Ở đây chúng ta cần quay lại tài liệu Gradle vì tài liệu của Gradle được viết rất tốt. Nó được gọi là " Quản lý cấu hình phụ thuộc ". Như đã nêu trong tài liệu, mỗi phần phụ thuộc được khai báo với một phạm vi nhất định - khu vực mà phần phụ thuộc này sẽ khả dụng. Phạm vi này được chỉ định bởi một số cấu hình, mỗi cấu hình có một tên duy nhất. Điều thú vị là nhiều plugin cho Gradle thêm các cấu hình được xác định trước. Để tìm hiểu những cấu hình nào chúng tôi có, chúng tôi có thể chạy: gradle --console plain dependencies Bằng cách này, chúng tôi sẽ thấy danh sách tất cả các cấu hình có sẵn và các phần phụ thuộc của chúng. Chúng tôi có thể lọc danh sách này để chỉ nhìn thấy các cấu hình có sẵn: gradle --console plain dependencies | find " - " Làm cách nào để chúng tôi biết nên sử dụng cái gì? Bạn sẽ phải đọc một chút ở đây. Bởi vì Chúng tôi sử dụng plugin "Java", vì vậy hãy bắt đầu với tài liệu của nó và phần " Quản lý phụ thuộc ". Ở đây chúng ta thấy rằng từng có một cấu hình (còn gọi là phạm vi) được gọi là “biên dịch” và nó có nghĩa là “cần có sự phụ thuộc trong quá trình biên dịch”. Nhưng sau đó nó đã được thay thế (bằng tiếng Anh là Superseded) bằng việc triển khai. Bạn có thể đọc thêm về việc thay thế trong phần " Phân tách API và triển khai ". Hóa ra phần phụ thuộc này sẽ nằm trên “đường dẫn lớp biên dịch”. Nhưng đôi khi chúng ta muốn phần phụ thuộc của mình được đưa vào tạo phẩm cuối cùng. Để làm gì? Ví dụ: chúng ta sẽ có một tệp thực thi, bản thân tệp này sẽ chứa mọi thứ cần thiết. Vậy thì chúng ta nên làm gì? Thứ nhất, không có sự hỗ trợ nào như vậy “dùng ngay” (nghĩa là theo mặc định, không có bất kỳ hành động bổ sung nào). Điều này được giải thích là do mọi người đều muốn thu thập kho lưu trữ theo cách riêng của mình và Gradle cố gắng tối giản. Chúng tôi cũng không thể sử dụng kho lưu trữ jar trên đường dẫn lớp (không có thao tác bổ sung trong mã), bởi vì nó không hoạt động theo cách đó (Xem " Oracle: Thêm các lớp vào đường dẫn lớp của tệp JAR " để biết thêm chi tiết). Vì vậy, cách hay nhất là đoạn mã sau trong tập lệnh xây dựng:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
Trong cài đặt tác vụ jar, chúng tôi chỉ định những gì sẽ được thêm vào tệp kê khai tệp jar (xem " Oracle: Đặt điểm nhập của ứng dụng "). Và sau đó chúng tôi nói rằng tất cả các phần phụ thuộc cần thiết để biên dịch sẽ được đưa vào jar. Một cách khác là sử dụng " Plugin Gradle Shadow ". Nó có vẻ phức tạp nhưng các plugin khác có thể giúp cuộc sống dễ dàng hơn. Ví dụ: khi tạo một ứng dụng web (trái ngược với một ứng dụng java đang chạy thông thường), chúng tôi sẽ sử dụng một plugin đặc biệt - “ Gradle War Plugin ”, có hoạt động khác và cuộc sống của chúng tôi sẽ dễ dàng hơn ở đó (tất cả các phụ thuộc cần thiết sẽ được chính plugin đặt trong một thư mục đặc biệt riêng. Công việc như vậy được quy định bởi cách thiết kế các ứng dụng web. Nhưng đó lại là một câu chuyện hoàn toàn khác).
Giới thiệu nhanh về Gradle - 9

Kết quả

Gradle là một lựa chọn tuyệt vời cho các hệ thống xây dựng dự án. Điều này được xác nhận bởi thực tế là nó được sử dụng bởi các nhà phát triển của các dự án nổi tiếng như Spring và Hibernate. Chỉ những điều cơ bản nhất đã được thảo luận ở trên. Đằng sau chúng ẩn chứa hàng triệu tính năng và cơ hội mà các nhà phát triển có được. Gradle cũng hỗ trợ việc tạo các dự án nhiều mô-đun, điều này không được đề cập trong bài đánh giá này, nhưng bản thân Gradle có một hướng dẫn tuyệt vời: “ Tạo các bản dựng nhiều dự án ”. Tôi hy vọng bài đánh giá này cũng chứng minh rằng tài liệu của Gradle được viết ở mức 5+ và bạn có thể dễ dàng tìm thấy những gì mình cần nếu bạn biết nơi cần tìm. Và điều này sẽ đến khi bạn hiểu những điều cơ bản. Ngoài ra, Gradle còn có những hướng dẫn tuyệt vời. Tôi muốn kết thúc bằng một danh sách nhỏ những gì bạn có thể thấy khi sử dụng Gradle:
Giới thiệu nhanh về Gradle - 10
#Viacheslav
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION