Transitive = true trong Gradle chính xác làm gì (wrt crashlytics)?


174

Gradle transitive = truelàm gì chính xác? Nó không rõ ràng từ tài liệu Gradle . Đây là trong bối cảnh của compilebên trong build.gradle. Trong trường hợp của tôi, tôi phụ thuộc vào sự cố của Android.

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

Một số tài liệu Gradle ( ở đâyở đây ) ngụ ý rằng "mặc định" mặc định là đúng. Tuy nhiên, loại bỏ transitive = truekết quả trong phụ thuộc bắc cầu không được đưa vào (đặc biệt KitGroup).

class file for io.fabric.sdk.android.KitGroup not found

Các tài liệu nói rằng nó mặc định là đúng, nhưng hành vi thực tế dường như ngược lại.

Tôi đang chạy Lớp 2.2.1. Có lẽ hành vi thay đổi giữa 2.2 và 2.4?

Chỉnh sửa : Các phụ thuộc Transitive liên quan không được giải quyết cho thư viện aar bằng cách sử dụng gradle


khi xác định cấu hình, hoặc khi xác định phụ thuộc?
dnault

Sự phụ thuộc của các tệp jar được xúc tiến đến các dự án phụ. Không phải mọi dự án đều cần xác định rõ ràng sự phụ thuộc của nó.
Konrad

Chính xác thì điều gì không rõ ràng trong tài liệu này ?
Oleg Estekhin

3
@OlegEstekhin tài liệu không phù hợp với hành vi thời gian chạy mà tôi đang thấy
Steve Kuo

Câu trả lời:


153

Bạn đang sử dụng @aarký hiệu.
Điều đó có nghĩa là bạn chỉ muốn tải xuống các tạo phẩm aar và không phụ thuộc.
Bạn có thể kiểm tra phần tài liệu này :
Kiểm tra 1.4.1.2. Artifact only notationphần:

Một ký hiệu chỉ tạo tác tạo ra một phụ thuộc mô-đun chỉ tải xuống tệp tạo tác với phần mở rộng được chỉ định. Mô tả mô-đun hiện có được bỏ qua .

Sử dụng @aarký hiệu nếu bạn muốn tải xuống các phụ thuộc, bạn nên thêm transitive=true.

Tôi hy vọng rằng bỏ qua @aar nó sẽ hoạt động mà không cần thêm thuộc tính bắc cầu.


7
Tôi xác nhận rằng bỏ qua @aar và loại bỏ thuộc tính bắc cầu hoạt động. Ý định ở đây là các nhà phát triển tham chiếu các bộ công cụ Fabric một cách rõ ràng (ví dụ: "biên dịch 'com.crashlytics.sdk.android:crashlytics:2.5.5'") và các lớp io.fotype.sdk.android cốt lõi được kéo qua phụ thuộc bắc cầu. Nếu bạn đặt transitive = false, thì lớp io.foven.sdk.android.Foven sẽ không được tìm thấy tại thời điểm biên dịch.
Đánh dấu McClelland

7
"tính năng" này rất tệ, tôi muốn một aar với sự phụ thuộc của nó. không có @aar, nó tìm kiếm bình và phàn nàn
dowi

12

Trên một lưu ý chung hơn: Cài đặt transitive = falsetrên crashlyticsthư viện khiến gradle bỏ qua tất cả các thư viện được yêu cầu bởi crashlytics(= "thư viện tạm thời") và không tải xuống và liên kết chúng.

Bạn sẽ phải tự thêm các thư viện cần thiết vào dự án của mình hoặc dựa vào các thư viện tạm thời khác được thêm bởi các phụ thuộc khác.

Mặc định cho lớp là transitive = true.

Ví dụ và giải thích đầy đủ ở đây: http://www.devsbedevin.net/android-under Hiểu-nâng cấp-dependencies-and-results- conftsts /


liên kết không hoạt động. Tôi e rằng nó không phải mặc định là đúng, bởi vì trong một số trường hợp cụ thể là viết đúng
Morozov

Liên kết @Morozov cố định. Cảm ơn GOTCHA!
Vaiden

5

Tôi đoán là tạo phẩm Crashlytics mà bạn đang đề cập thủ công chỉ định các phụ thuộc là không mang tính bắc cầu ( transitive=false) để bạn không bị buộc phải mang các phụ thuộc đó theo mặc định. Đó là lý do tại sao bạn nhìn thấy hành vi ngược lại. Ví dụ: một số nhà phát triển có thể không muốn sử dụng tất cả các Dịch vụ của Google Play hoặc bất cứ điều gì khác mà Crashlytics có thể sử dụng nếu có.

Vì vậy, bằng cách loại bỏ điều đó, Gradle không còn kéo theo sự phụ thuộc và không thể xây dựng được. Bạn có thể chỉ định phụ thuộc đó bằng tay nếu bạn cần.

Điều đó đang được nói - Tôi nghĩ rằng vấn đề lớn hơn là bạn không nên trực tiếp tham khảo cổ vật Crashlytics - bạn nên sử dụng Fabric và kéo theo Crashlytics như sau: https://dev.twitter.com/foven/ tích hợp android


Các hướng dẫn để di chuyển sang Fabric chỉ định tham chiếu trực tiếp vào tạo phẩm Crashlytics, giả sử bạn đang sử dụng "bộ" vải đó: Fabric.io/migations/gradle
Mark McClelland

Có vẻ như ý định là bạn tham chiếu các bộ dụng cụ trực tiếp và chúng kéo vào các lớp io.foven.sdk.android thông qua sự phụ thuộc bắc cầu.
Đánh dấu McClelland

1

Đặt liệu phụ thuộc này có nên được giải quyết bao gồm hoặc loại trừ các phụ thuộc bắc cầu của nó hay không. Các vật phẩm thuộc về sự phụ thuộc này có thể chúng có sự phụ thuộc vào các vật phẩm khác. Cái sau được gọi là phụ thuộc bắc cầu.


1

Gradle theo phụ thuộc bắc cầu theo mặc định. Nếu bạn muốn tắt nó cho một thư viện cụ thể, hãy sử dụng cờ bắc cầu.

Thay đổi giá trị của cờ chuyển tiếp thành sai sẽ ngăn việc tải xuống các phụ thuộc bắc cầu, do đó bạn sẽ phải tự thêm bất cứ thứ gì được yêu cầu. Nếu bạn chỉ muốn một jar mô-đun, không có bất kỳ phụ thuộc bổ sung nào, bạn cũng có thể chỉ định điều đó.


2
Giá trị nào đã làm điều này thêm vào ngoài lời khuyên trong câu trả lời được đánh giá cao?
hrbrmstr

-19

transitivekiểm soát độ xuyên sáng. Lớp thường mặc định là bắc cầu, trừ khi nó không. Có một lỗi với tính siêu việt và phân loại, xem https://issues.gradle.org/browse/GRADLE-3188 .


39
Tôi nghĩ thật công bằng khi bạn chỉ ra một lỗi. Nhưng, mô tả của bạn về tài sản không hữu ích. "transitive điều khiển tính siêu việt. Gradle thường mặc định là transitive, trừ khi nó không." Thật sao, anh bạn? ... Thật sao?
w3bshark

4
@ w3bshark Tôi nghĩ nó thật buồn cười. "mặc định là bắc cầu, trừ khi nó không" là khá chính xác theo kinh nghiệm của tôi.
Navin

4
@ w3bshark Tôi có thể quan tâm ít hơn về số phiếu. Tôi đang chia sẻ những gì tôi đã học được với cộng đồng.
Steve Kuo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.