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()
смотрит в extensions
ExtensionContaier
вместо. Это несколько странно, так как документация для 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)
}