在 build.gradle.kts 中外部化任务
Externalize Task in build.gradle.kts
目前我在中央 build.gradle.kts 中拥有所有 gradle-任务的配置。由于这个文件会变得太长,我计划至少将一些任务外化到他们自己的文件中。
目前我的 build.gradle.kts 看起来有点像下面这样:
import org.asciidoctor.gradle.jvm.AsciidoctorTask
val revDate = System.getenv()["revdate"] ?: SimpleDateFormat("yyyy-MM-dd").format(Date())
val revNumber = System.getenv()["revnumber"] ?: "DEV-Version"
plugins {
...
id("org.asciidoctor.jvm.convert") version "3.1.0"
...
}
tasks.withType<AsciidoctorTask>().configureEach {
setSourceDir(file("src/docs"))
setOutputDir(file("$buildDir/docs"))
attributes(
mapOf(
"source-highlighter" to "rouge",
"toc" to "left",
"toclevels" to 2,
"idprefix" to "",
"idseparator" to "-",
"revnumber" to "$revNumber",
"revdate" to "$revDate"
)
)
}
如果调用 asciidoctor-Tasks,以上 build.gradle.kts 会生成我的文档。现在我尝试使用
外部化上述配置
apply {
from("gradle/asciidoctor.gradle.kts")
}
在build.gradle.kts里面,进一步定义上面使用的文件:
#gradle/asciidoctor.gradle.kts
import org.asciidoctor.gradle.jvm.AsciidoctorTask
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath("org.asciidoctor:asciidoctor-gradle-jvm:3.1.0")
}
}
apply{
plugin("org.asciidoctor.jvm.convert")
}
tasks.withType<AsciidoctorTask>().configureEach {
setSourceDir(file("src/docs"))
setOutputDir(file("$buildDir/docs"))
attributes(
mapOf(
"source-highlighter" to "rouge",
"toc" to "left",
"toclevels" to 2,
"idprefix" to "",
"idseparator" to "-",
"revnumber" to "$project.revNumber",
"revdate" to "$project.revDate"
)
)
}
不幸的是,这不能正常工作并给了我一个例外,找不到具有给定 ID ('org.asciidoctor.jvm.convert') 的插件。
我正在使用 gradle 6.6.1.
我错过了什么,我应该怎么做?
在包含的脚本中,您只能获得默认环境。您无权访问主项目文件中应用的插件,也不能应用任何其他插件。这与 Groovy DSL 不同,没有办法绕过它。
相反,您必须将此逻辑放入 buildSrc 中。 Gradle Kotlin 提供了预编译的脚本插件,让这一切变得非常简单。您创建一个文件 buildSrc/src/main/kotlin/my-plugin.gradle.kts
并在其中添加与您在包含的脚本中添加的代码相同的代码。
然后,在您的项目中,您可以在插件块中添加:
plugins {
`my-plugin`
}
此外,buildSrc/build.gradle.kts
必须包含:
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
gradlePluginPortal()
}
有关详细信息,请参阅 Gradle documentation。
目前我在中央 build.gradle.kts 中拥有所有 gradle-任务的配置。由于这个文件会变得太长,我计划至少将一些任务外化到他们自己的文件中。
目前我的 build.gradle.kts 看起来有点像下面这样:
import org.asciidoctor.gradle.jvm.AsciidoctorTask
val revDate = System.getenv()["revdate"] ?: SimpleDateFormat("yyyy-MM-dd").format(Date())
val revNumber = System.getenv()["revnumber"] ?: "DEV-Version"
plugins {
...
id("org.asciidoctor.jvm.convert") version "3.1.0"
...
}
tasks.withType<AsciidoctorTask>().configureEach {
setSourceDir(file("src/docs"))
setOutputDir(file("$buildDir/docs"))
attributes(
mapOf(
"source-highlighter" to "rouge",
"toc" to "left",
"toclevels" to 2,
"idprefix" to "",
"idseparator" to "-",
"revnumber" to "$revNumber",
"revdate" to "$revDate"
)
)
}
如果调用 asciidoctor-Tasks,以上 build.gradle.kts 会生成我的文档。现在我尝试使用
外部化上述配置apply {
from("gradle/asciidoctor.gradle.kts")
}
在build.gradle.kts里面,进一步定义上面使用的文件:
#gradle/asciidoctor.gradle.kts
import org.asciidoctor.gradle.jvm.AsciidoctorTask
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath("org.asciidoctor:asciidoctor-gradle-jvm:3.1.0")
}
}
apply{
plugin("org.asciidoctor.jvm.convert")
}
tasks.withType<AsciidoctorTask>().configureEach {
setSourceDir(file("src/docs"))
setOutputDir(file("$buildDir/docs"))
attributes(
mapOf(
"source-highlighter" to "rouge",
"toc" to "left",
"toclevels" to 2,
"idprefix" to "",
"idseparator" to "-",
"revnumber" to "$project.revNumber",
"revdate" to "$project.revDate"
)
)
}
不幸的是,这不能正常工作并给了我一个例外,找不到具有给定 ID ('org.asciidoctor.jvm.convert') 的插件。
我正在使用 gradle 6.6.1.
我错过了什么,我应该怎么做?
在包含的脚本中,您只能获得默认环境。您无权访问主项目文件中应用的插件,也不能应用任何其他插件。这与 Groovy DSL 不同,没有办法绕过它。
相反,您必须将此逻辑放入 buildSrc 中。 Gradle Kotlin 提供了预编译的脚本插件,让这一切变得非常简单。您创建一个文件 buildSrc/src/main/kotlin/my-plugin.gradle.kts
并在其中添加与您在包含的脚本中添加的代码相同的代码。
然后,在您的项目中,您可以在插件块中添加:
plugins {
`my-plugin`
}
此外,buildSrc/build.gradle.kts
必须包含:
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
gradlePluginPortal()
}
有关详细信息,请参阅 Gradle documentation。