Android — Thêm Gradle dependencies sử dụng “foreach”.
Một project lớn trong Android với nhiều module đi kèm với điều đó ta phải cấu hình nhiều file Gradle khác nhau, đó hẳn là một việc nhàm chán, trong bài viết này tôi sẽ giải thích làm thế nào để có thể kiểm soát được tất cả các modules dependencies mà chỉ sử dụng duy nhất 1 file Gradle.
Mục đích là chuyển file với nhiều dependencies như thế này
thành như này
Dependencies File
Để hoàn thành việc chuyển đổi việc đầu tiên ta cần làm là tạo một file để quản lý tất cả các project dependencies.
Tạo một file gọi là dependencies.gradle trong root project và xác định version các thư viện sẽ được sử dụng như hình bên dưới.
Tiếp theo, ta định nghĩa các dependencies, để file có tổ chức nhất có thể, ta định nghĩa ra 3 ánh xạ:
+ Thư viện support có sẵn của Android
+ Các thư viện third party
+ Các thư viện hỗ trợ testing
Sẽ trông giống như này
Bây giờ với mỗi module ta cần tạo 1 danh sách những thư viện cần thiết, ví dụ như app module bên dưới ta tạo ra với tên là appDependencies, nó sẽ cần đến các thư viện như AppCompat, Dagger, RxJava, RxAndroid
Giờ mở file build.gradle trong app module và viết vào như sau
Tới đây chắc hẳn bạn sẽ hỏi How does this works?
Thường khi ta muốn dùng một thư viện mới ta khai báo dependency như sau
dependencies {
compile 'com.google.code.gson:gson:2.7'
}
Khi đó hàm add trong DependencyHandle sẽ được gọi đến.
add(String configurationName, Object dependencyNotation)Adds a dependency to the given configuration.
Nhìn vào hàm trên ta thấy có 2 biến được truyền vào, đầu tiên là configuration name(nó có thể là compile, testCompile, androidTestCompile ….) và biến thứ hai tất nhiên rồi nó là Dependency.
Dependency có thể được định nghĩa theo cách thông thường là một chuỗi String như sau :
'com.google.code.gson:gson:2.7'
Nếu sử dụng phiên bản Gradle mới nhất nó có thể được viết như thế này
[group: ‘com.google.code.gson’, name: ‘gson’, version: '2.7']
Quay trở lại với đoạn code
Với đoạn code trên ta sẽ add các phần tử của mảng appDependencies mà ta đã khai báo trước đó. Groovy cung cấp biến “it” cho phép ta lấy được phần tử hiện tại trong mảng sau mỗi lần lặp.
Đến đây bạn đã hình dung ra phần nào cách chúng ta quản lý Gradle dependencies mà chỉ cần sử dụng 1 file duy nhất. Với cách này các thư viện sẽ được tái sử dụng lại trong các module khác mà không cần phải khai báo lại, thật tiện lợi phải không nào.
Dependencies giữa các module
Trong file dependencies.gradle ta khai báo các module cần dùng trong project. Ví dụ ở đây ta khai báo 3 module là app, data và domain.
Nếu app module sử dụng domain module, thì trong appDependencies ta khai báo như sau
Options
Thông thường muốn exclude một module ta làm như sau
androidTestCompile ('com.android.support.test:runner:0.5') {
exclude module: 'support-annotations'
}
Trong trường hợp này ta sẽ làm theo cách khác. Đầu tiên ta thêm vào file dependencies.gradle như sau
Trong file build.gradle của app module ta cần thay đổi phương thức add, có thêm một tham số mở rộng là Closure để đặt các option vào đó.
add(String configurationName, Object dependencyNotation, Closure configureClosure)Adds a dependency to the given configuration, and configures the dependency using the given closure.
Và đây là kết quả
Plugins
Với cách này chúng ta cũng có thể quản lý và kiểm soát các plugin được sử dụng trong mỗi module từ file dependencies.gradle. Hãy xem ví dụ sau
Sẽ được thay thế bằng
Để làm được như vậy,ta chỉ cần tạo ra danh sách các plugin sẽ được sử dụng trong file dependencites.gradle.
Vậy là xong, nhiệm vụ cuối cùng của ta là cách dùng file dependencies.gradle như thế nào.
Call dependencies.gradle
apply from: 'dependencies.gradle'
Trong file build.gradle của root project ta viết thêm vào như bên trên, vậy là xong rồi đó.
Nếu bạn thấy khó hiểu hãy tham khảo repository ví dụ tại đây.
Lời kết
Đây là lần đầu tiên mình viết blog, ngữ nghĩa còn lủng củng chưa được chau chuốt nhiều, mình sẽ cải thiện trong những bài viết tới, cám ơn các bạn đã đón đọc.