Что такое транзитивность

Ответ

Транзитивность в контексте зависимостей 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
}

Бум — и всё. Больше никаких сюрпризов. Сидишь и сам решаешь, кто тебе в проект попадёт, а кто нет. Красота, ёклмн.