Как добавить зависимость от основного проекта к подпроектам в gradle/groovy?

Учитывая следующую структуру проекта:

.
├── src
│   └── proto
│       └── ....
├── build/generated/..
│   ...
├── proj1
│   ├── src
│   │   └──...
│   └── build.gradle
├── proj2
│   └── person-service
│       ├── src
│       │   └──...
│       └── build.gradle
├── build.gradle
└── settings.gradle

и настройки.градле:

rootProject.name = 'mainProj'

include 'proj1'
include 'proj2'

mainProj компилирует некоторые классы Java в папку сборки, которая включается в build.gradle mainProj с помощью sourceSets; И компилируются нормально.

Однако подпроект не может получить доступ к сгенерированным классам при компиляции. К сожалению, в proj1/build.gradle не работает следующее:

dependencies {
    runtimeOnly  project(':mainProj')
}

Это не удается с:

...
A problem occurred evaluating project ':proj1'.
> Project with path ':MainProj' could not be found in project ':proj1'.
...

В противном случае подпроекты компилируются/запускаются нормально без кода этой отсутствующей зависимости.


person David Tóth    schedule 24.02.2021    source источник


Ответы (1)


Примечание. Магия Stackoverflow заключается в том, что всякий раз, когда я публикую вопрос, мне удается обдумать проблему таким образом, чтобы найти решение. Так обстоит дело с 80% моих вопросов.

Одним из решений было добавить в проект еще один подмодуль:

настройки.градле:


rootProject.name = 'mainProj'

include `shared`
include 'proj1'
include 'proj2'

Все, что есть в ./build.gradle, должно быть перемещено в ./shared/build.gradle; Расположение (учитывая, что подпроекты правильно настроены в settings.gradle) не должно иметь значения. В этом решении корень build.gradle можно оставить пустым.

После того, как вышеописанное сделано, следующая зависимость должна быть допустимой:

dependencies {
    runtimeOnly  project(':shared')
}
person David Tóth    schedule 24.02.2021
comment
Вероятно, это лучший дизайн по другим причинам, но просто чтобы вы знали, почему первый подход не сработал: когда вы пишете project(':mainProj'), Gradle ищет подпроект с именем mainProj. Чтобы найти корневой проект, просто введите project(':'). - person Bjørn Vester; 25.02.2021
comment
Я думаю, что это ответ, который я искал! - person David Tóth; 25.02.2021