Gradle Kotlin DSL: получить набор исходников другого проекта

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

Наш проект - это простой многопроектный. Допустим, у нас Core, Plugin и Plugin используют классы из Core. Теперь при сборке Plugin целевая банка должна включать все используемые классы из 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.

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

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


person K. D.    schedule 30.10.2018    source источник


Ответы (2)


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

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

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

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

person Kristóf Marussy    schedule 31.10.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)
 }
person dwursteisen    schedule 31.10.2018
comment
Спасибо. Я тоже пробовал, но это тоже не работает: 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 - person K. D.; 31.10.2018