GradleKotlin DSL:获取另一个项目的sourceSet



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

我们的项目是一个简单的多项目。假设我们有CorePlugin,并且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

我希望有人能帮助我们,因为花几个小时在配置上而不是编写任何有用的代码是非常令人沮丧的。

事先非常感谢。

您可以通过访问SourceSetContainer

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

似乎<T : Any> Project.the(extensionType: KClass<T>): T在项目的convention中查找,而val Project.sourceSets: SourceSetContainer get()extensionsExtensionContaier中查找。这有点奇怪,因为the的文档中说"返回指定类型的插件约定或扩展。">

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

如果您可以访问该项目,那么一切都应该看起来像您实际的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)
}

最新更新