如何延迟获取 Gradle 中的主要 sourceSets
How to lazily get main sourceSets in Gradle
我需要为我所有的子项目配置sources jar。我定义了以下 subprojects
配置:
subprojects {
apply(plugin = "java-library")
val sourcesJar = tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(the<SourceSetContainer>().named("main").get().allJava)
}
tasks.named("assemble") {
dependsOn(sourcesJar)
}
}
当我尝试 运行 ./gradlew tasks
时,我在我的子项目中收到一个异常:
Extension of type 'SourceSetContainer' does not exist. Currently registered extension types: [ExtraPropertiesExtension]
我的假设是访问扩展的 get()
方法会导致问题,但如果没有它,我将无法引用我需要的 allJava
来源。那么如何使用配置规避来达到预期的效果呢API?
运行 Gradle 5.2.1 with Kotlin DSL。
我找到了可行的解决方案。问题是,当您调用 the<T>()
函数时,它是从 Task
类型中获取的,这就是它抱怨缺少扩展名的原因。解决方案是像这样在 project
实例上调用 the<T>()
函数:
subprojects {
apply {
plugin<JavaLibraryPlugin>()
}
val sourcesJar by tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(
// take extension from project instance
project.the<SourceSetContainer>().named("main").get().allJava
)
}
}
我需要为我所有的子项目配置sources jar。我定义了以下 subprojects
配置:
subprojects {
apply(plugin = "java-library")
val sourcesJar = tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(the<SourceSetContainer>().named("main").get().allJava)
}
tasks.named("assemble") {
dependsOn(sourcesJar)
}
}
当我尝试 运行 ./gradlew tasks
时,我在我的子项目中收到一个异常:
Extension of type 'SourceSetContainer' does not exist. Currently registered extension types: [ExtraPropertiesExtension]
我的假设是访问扩展的 get()
方法会导致问题,但如果没有它,我将无法引用我需要的 allJava
来源。那么如何使用配置规避来达到预期的效果呢API?
运行 Gradle 5.2.1 with Kotlin DSL。
我找到了可行的解决方案。问题是,当您调用 the<T>()
函数时,它是从 Task
类型中获取的,这就是它抱怨缺少扩展名的原因。解决方案是像这样在 project
实例上调用 the<T>()
函数:
subprojects {
apply {
plugin<JavaLibraryPlugin>()
}
val sourcesJar by tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(
// take extension from project instance
project.the<SourceSetContainer>().named("main").get().allJava
)
}
}