首页 > 解决方案 > Gradle Kotlin DSL:获取另一个项目的 sourceSet

问题描述

目前,我们正在尝试将现有build.gradle脚本迁移到新的 Kotlin DSL。现在,我们正在为jar任务配置而苦苦挣扎。

我们的项目是一个简单的多项目。假设我们已经Core和使用Plugin了. 现在,在构建时,目标 jar 应该包含来自.PluginCorePluginCore

这是它之前的样子:

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.

我希望有人可以帮助我们,因为花费数小时进行配置而不是编写任何有用的代码非常令人沮丧。

非常感谢您提前。

标签: gradlekotlingradle-kotlin-dsl

解决方案


您可以SourceSetContainer通过

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

它似乎<T : Any> Project.the(extensionType: KClass<T>): Tconvention项目中,而在项目中val Project.sourceSets: SourceSetContainer get()看起来extensions ExtensionContaier。这有点奇怪,因为文档中the说“返回指定类型的插件约定或扩展”。

请注意,您可能需要在 中进行 sourceSet 操作gradle.projectsEvaluated,否则如果尚未评估相应的项目,则可能尚未配置有问题的 sourceSet。


推荐阅读