当前,我们正在尝试将现有的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
。
我希望有人能为我们提供帮助,因为花费数小时进行配置而不是编写任何有用的代码非常令人沮丧。
非常感谢您。
答案 0 :(得分:0)
如果您可以访问该项目,那么所有内容都应该看起来像您的实际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)
}
答案 1 :(得分:0)
您可以通过以下方式访问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
中进行sourceSet操作,因为否则,如果尚未评估相应的项目,则可能尚未配置有问题的sourceSet。