Gradle Multi Project транзитивная зависимость - PullRequest
0 голосов
/ 28 марта 2019

У меня есть три gradle проекта. Скажите ProjectA, ProjectB и ProjectC.

ProjectC зависит от ProjectA и ProjectB. В то время как ProjectB зависит от ProjectA.

Итак, ProjectC build.gradle имеет следующие строки:

dependencies {
  implementation project(':ProjectA')
  implementation project(':ProjectB')
}

И ProjectB build.gradle имеет следующее:

dependencies {
  implementation project(':ProjectA')
}

Мой вопрос: зачем мне нужно явное объявление implementation для ProjectA в файле сборки ProjectC?

Поскольку я добавляю ProjectB, не следует ли автоматически включать ProjectA, поскольку ProjectB зависит от ProjectA?

Другими словами, почему следующее не работает для ProjectC?

dependencies {
  implementation project(':ProjectB')
}

Я новичок в gradle и, таким образом, пытаюсь понять, как управление зависимостями между работой проекта.


Edit:

Итак, я хочу изменить build.gradle ProjectB на ниже:

dependencies {
  api project(':ProjectA')
}

Чтобы я мог упростить ProjectC build.gradle до:

dependencies {
  implementation project(':ProjectB')
}

Однако я получаю следующую ошибку:

A problem occurred evaluating project ':ProjectB'.
> Could not find method api() for arguments [:ProjectA] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

Я что-то упустил?

1 Ответ

0 голосов
/ 28 марта 2019

Потому что implementation именно для этого: он говорит, что ProjectA необходим для работы кода ProjectB (внутренне), но не является частью его API (то есть вы не хотите, чтобы клиенты ProjectB полагались нафакт, что он использует ProjectA внутри).

Если вы хотите, чтобы ProjectA был частью API или ProjectB, используйте конфигурацию api, а не реализацию.

Подробнее см. в руководстве .

...