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

В настоящее время мы пытаемся перенести наш существующий build.gradle скрипты к новому Kotlin DSL. Прямо сейчас мы боремся с 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 ответа

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

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

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

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

Если вы получаете доступ к проекту, то все должно выглядеть так, как если бы вы работали с отличным скриптом 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)
 }
Другие вопросы по тегам