Ответ
Транзитивность в контексте зависимостей Gradle означает, что если модуль A зависит от модуля B, а модуль B зависит от модуля C, то модуль A автоматически получает зависимость от модуля C.
Пример:
// moduleA зависит от moduleB
implementation 'com.example:moduleB:1.0'
// moduleB зависит от moduleC
В этом случае moduleA получит и moduleC транзитивно.
Как управлять:
Можно явно исключить транзитивную зависимость:
implementation('com.example:moduleB:1.0') {
exclude group: 'com.example', module: 'moduleC'
}
Или отключить транзитивность полностью:
implementation('com.example:moduleB:1.0') {
transitive = false
} Ответ 18+ 🔞
А, слушай, про транзитивность в Gradle? Ну это, блядь, классика жанра, ёпта. Представь себе такую хуйню: у тебя есть модуль А, который тянет модуль Б. А этот самый модуль Б, хитрая жопа, сам зависит от модуля В. Так вот, транзитивность — это когда твой модуль А автоматом, по-братски, начинает тянуть и модуль В тоже. Без спроса, нагло, как будто так и надо. Сам от себя охуел, когда впервые с этим столкнулся.
Пример, чтобы совсем понятно стало:
// moduleA зависит от moduleB
implementation 'com.example:moduleB:1.0'
// moduleB внутри себя зависит от moduleC
И всё, привет. Собираешь проект, а тебе в дерево зависимостей прилетает этот самый moduleC. Типа, сюрприз, ебать мои старые костыли! Теперь он твой лучший друг, хочешь ты того или нет.
А как этим безобразием управлять, если надоело? Ну, можно эту наглую транзитивную зависимость выпилить, как гнойник. Вот так:
implementation('com.example:moduleB:1.0') {
exclude group: 'com.example', module: 'moduleC'
}
Сказал — и нету его. Чих-пых тебя в сраку, moduleC, иди на хуй отсюда. Или вообще, если доверия ебать ноль ко всем этим транзитивным связям, можно отключить эту фичу полностью, одним махом:
implementation('com.example:moduleB:1.0') {
transitive = false
}
Бум — и всё. Больше никаких сюрпризов. Сидишь и сам решаешь, кто тебе в проект попадёт, а кто нет. Красота, ёклмн.