Задний план
(Пожалуйста, имейте в виду, что я упростил задачу для целей обсуждения здесь)
У меня есть набор приложений и зависимых библиотек, примерно так (каждый с каталогом
src/
иbuild.gradle
):appa/ appb/ libx/ liby/ libz/
В
build.gradle
зависимости в настоящее время объявлены следующим образом:appa/build.gradle: compile "com.asdf:libx:1.0" compile "com.asdf:liby:1.0" appb/build.gradle: compile "com.asdf:liby:1.0" liby/build.gradle: compile "com.asdf:libz:1.0"
Какую проблему я пытаюсь решить
- Say I'm working on
appa
, and I need to make changes tolibx
. I need to do multiple steps:- Pull
libx
from source control and make changes locally - Восстановите и отправьте изменения в какое-то репо (не в прод!)
- Rebuild
appa
(вытаскивание недавно обновленногоlibx
из репо)
- Pull
- Если мое тестирование обнаружит ошибку в
libx
, мне придется повторить это снова. - Это очень раздражает при работе в IDE, таких как Eclipse, где, хотя мои проекты логически используют другие проекты, мне все равно приходится использовать артефакты как зависимости.
- Разве не было бы замечательно, если бы я мог просто вытащить проект локально, и проекты, которые логически зависят от него, будут автоматически использовать исходный проект вместо артефакта для сборки?
Что я сделал до сих пор
Я написал небольшой плагин gradle (на который есть ссылка в
build.gradle
каждого проекта), который определяетcom.asdf
зависимости и использует подстановка зависимости для замены зависимости артефакта зависимостью проекта, если этот проект существует локально.configurations.all { resolutionStrategy.dependencySubstitution { all { DependencySubstitution dependency -> if (dependency.requested instanceof ModuleComponentSelector && dependency.requested.group == 'com.asdf') { def targetProject = findProject(":${dependency.requested.module}") if (targetProject != null) { dependency.useTarget targetProject } } } } }
Ура! С некоторыми изменениями в
settings.gradle
(см. Ниже) я достиг своей цели ... За исключением ...
Где я застрял
Мне нужно изменить
settings.gradle
, чтобы включить такие строки для каждой зависимости (иначеfindProject
не разрешит зависимый проект во время сборки):include ':libx' project(':libx').projectDir = new File(settingsDir, '../libx')
Хотя возможно просмотреть все
settings.gradle
файлы и сделать это (я сделал это несколько раз в качестве доказательства концепции), это некрасиво, однообразно и логически является той же информацией, что и передаетсяcompile
аргументамbuild.gradle
зависимостей.- It's also error-prone when someone adds a new dependency but doesn't update
settings.gradle
, or introduces a typo between them.
- It's also error-prone when someone adds a new dependency but doesn't update
- Я также пробовал сделать
settings.gradle
просто определять проекты для всех каталогов, которые он находит на этом уровне, но затем сборка любого проекта превращается в мега-сборку всех проектов. - (Я пробовал несколько других вещей, но мой вопрос уже давно звучит)
Мой вопрос
Как лучше сделать это, не дублируя информацию между settings.gradle
и build.gradle
? Я хочу сделать так, чтобы добавление новых зависимостей было таким же простым, как добавление ссылки compile
в build.gradle
, не касаясь _28 _...
Я все еще новичок в groovy / gradle, так что, может быть, мне не хватает чего-то, что очевидно для более опытного мастера gradle?