Бывает, что в maven старая версия какой либо библиотеки или необходимо внести небольшие изменения в код внешней библиотеки. Для этого можно склонировать git репозиторий и скопировать папку модуля в свой проект, но обновление такого модуля на последние изменения от разработчика будет требовать много действий. Поэтому лучше использовать git submodules + Gradle Composite build.
Для начала в папке своего проекта создаем git submodule
$ git submodule add https://github.com/sample/projB
После этого в нашем проекте появится папка с проектом projB со своим репозиторием Git. Таким образом внесение изменений в файлы проекта projB не влияют на репозиторий основного проекта. И обновлять подпроект на последнюю версию от разработчика легко через git pull.
Далее нужно настроить зависимость основного проекта от подпроекта. Есть два варианта Composite build и Multi-Project Build.
Multi-Project Build – это обычная работа с модулями gradle через include(“:modulename”) в файле settings.gradle.kts. Он плохо подходит для нашего случая, т.к. придется менять gradle скрипты в подпроекте.
Composite build позволяет просто использовать git submodule. Для системы сборки такой подпроект выглядит как просто отдельный проект, а не модуль.
Для настройки Composite build в settings.gradle.kts основного проекта пишем:
rootProject.name = "ProjA"
include(":myApp")
//указываем сборку подпроекта как отдельного проекта, а не модуля
includeBuild("projB"){
//делаем связь между модуем и идентификатором проекта для
//описания зависимости в других модулях
dependencySubstitution {
//естественно здесь пишем свои названия групп и модулей
//"com.itmindco:projB" - это пример, ":projB" - название модуля в подпроекте
substitute(module("com.itmindco:projB")).using(project(":projB"))
}
}
далее в build.gradle.kts нашего модуля пишем зависимость так:
sourceSets {
val commonMain by getting {
dependencies {
implementation(compose.runtime)
implementation(compose.material3)
api("com.itmindco:projB")
}
}
}
И эта зависимость возьмется не с maven, а с локального подроекта.
Если бы мы не прописали dependencySubstitution, то зависимость скачалась бы с maven