Gradle Kotlin DSL: получить исходный код другого проекта - PullRequest
0 голосов
/ 30 октября 2018

В настоящее время мы пытаемся перенести существующие сценарии build.gradle в новый DSL Kotlin. Сейчас мы боремся с конфигурацией задачи jar.

Наш проект представляет собой простой мультипроект. Допустим, у нас Core и Plugin и Plugin используются классы из Core. Теперь при сборке Plugin целевой jar должен включать все используемые классы из Core.

Вот как это выглядело раньше:

jar {
    from sourceSets.main.output
    from project(':Core').sourceSets.main.output
}

И это текущее решение, которое мы используем с Kotlin DSL:

val jar: Jar by tasks
jar.apply {
    from(java.sourceSets["main"].allSource)
    from(project(":Core").the<SourceSetContainer>()["main"].allSource)
}

Тем не менее, приведенный выше пример просто дает мне ошибку Extension of type 'SourceSetContainer' does not exist. Currently registered extension types: [ExtraPropertiesExtension]. Я также пробовал другие фрагменты кода, которые нашел, но пока ни один из них не работал.

Я также попробовал это (как предложено в первом ответе):

val jar: Jar by tasks
jar.apply {
    from(java.sourceSets["main"].allSource)
    from(project(":Core").sourceSets.getByName("main").allSource)
}

Но тогда IDE (а также задача jar) утверждает, что sourceSets недоступно: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public val KotlinJvmProjectExtension.sourceSets: NamedDomainObjectContainer<DefaultKotlinSourceSet> defined in org.gradle.kotlin.dsl.

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

Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете получить доступ к SourceSetContainer по

project(":Core").extensions.getByType(SourceSetContainer::class)

похоже <T : Any> Project.the(extensionType: KClass<T>): T выглядит в convention проекта, а val Project.sourceSets: SourceSetContainer get() - extensions ExtensionContaier. Это несколько странно, так как в документации для the написано «Возвращает соглашение о плагине или расширение указанного типа.»

Обратите внимание, что вам может потребоваться выполнить манипуляции с sourceSet в gradle.projectsEvaluated, поскольку в противном случае рассматриваемый sourceSet может быть еще не настроен, если соответствующий проект еще не оценен.

0 голосов
/ 31 октября 2018

Если вы получаете доступ к проекту, то все должно выглядеть так, как если бы вы работали с скриптом Groovy Gradle:

 project(":Core").sourceSets.getByName("main").allSource

Так что относительно вашего фактического кода:

 val jar: Jar by tasks
 jar.apply {
     from(java.sourceSets["main"].allSource)
     from(project(":Core").sourceSets.getByName("main").allSource)
 }
...