2017-06-07 20 views
8

Như đã thấy trong Android Studio 3.0 (canary 3.0), chúng tôi hiện thêm depedencies bằng cách tuyên bố implementation thay vì cấu hình compile.Tại sao Android thay đổi 'biên dịch' thành cấu hình 'triển khai' trong phụ thuộc Gradle?

// Before 
compile 'com.android.support:appcompat-v7:25.3.1' 

// Currently 
implementation 'com.android.support:appcompat-v7:25.3.1' 

Chúng tôi vẫn có thể sử dụng compile, nhưng tôi muốn hiểu:

  • sự khác biệt giữa implementationcompile cấu hình là gì?
  • Tại sao Android Gradle xây dựng thay đổi để sử dụng implementation làm mặc định?

Trả lời

9

Có vẻ như compile không được dùng nữa và api hoặc implementation nên được sử dụng thay thế. Theo The Java Library Plugin - Gradle User Guide Version 3.5:

Cấu hình compile vẫn còn tồn tại nhưng không nên dùng vì nó sẽ không cung cấp đảm bảo rằng các apiimplementation cấu hình cung cấp.

10

Nhờ có liên kết hữu ích từ @petter, tôi muốn thêm tóm tắt.

Điều đó có nghĩa là Android Gradle build bắt đầu sử dụng java-library plugin thay vì plugin java trước đó. Plugin này giới thiệu khái niệm exposed API với hai số configuration để khai báo các phụ thuộc.

  1. api

nên được sử dụng để khai báo phụ thuộc mà được xuất khẩu bởi các API thư viện

Ví dụ, trong một trường hợp mà bạn đang xây dựng một Java (hoặc Android) được sử dụng bởi các ứng dụng khác. Nếu bạn sử dụng bất kỳ thư viện của bên thứ ba nào và bạn cũng muốn hiển thị API của nó cho người tiêu dùng của thư viện, bạn nên khai báo như thế này.

api 'commons-httpclient:commons-httpclient:3.1' 
  1. thực hiện

nên được sử dụng để khai báo sự phụ thuộc đó là nội bộ để các thành phần .

Khi phát triển ứng dụng Android, mô-đun app của chúng tôi là điểm kết thúc không cần để lộ bất kỳ bộ phận nào bên ngoài. implementation nên được sử dụng.

implementation 'org.apache.commons:commons-lang3:3.5' 

Trước compile cấu hình hoạt động như cùng api, lợi ích của implementation là:

  • phụ thuộc không rò rỉ ra classpath biên dịch của người tiêu dùng nữa, vì vậy bạn sẽ không bao giờ vô tình phụ thuộc vào một transitive sự phụ thuộc
  • biên dịch nhanh hơn nhờ giảm kích thước đường dẫn lớp học
  • ít được biên dịch lại khi imp lementation phụ thuộc thay đổi: người tiêu dùng sẽ không cần phải được biên dịch lại
  • xuất bản sạch hơn: khi sử dụng kết hợp với các mới maven-xuất bản plugin, thư viện Java tạo ra file POM rằng
    phân biệt chính xác giữa những gì là cần thiết để biên dịch chống lại các
    Thư viện và những gì cần thiết để sử dụng thư viện khi chạy (trong các từ khác , không pha trộn những gì cần thiết để biên dịch thư viện và
    những gì cần thiết để biên dịch thư viện).
Các vấn đề liên quan