Бывает, что в 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *