前回のエントリのやつが解決した
こんなことがしたい
sample {
configKey = "test config key"
books {
quickStart {
title = "quick start book"
body = "quick start book body"
}
userGuide {
title = "user guide book"
body = "user guide book body"
}
}
}
といったbuild.gradleがあった場合、動的にbooks内のquickStartやuserGuideごとのタスクを生成したい
具体的に書くと、quickStartBookReadとかuserGuideBookReadとかいうタスクを動的に生成したい
ソースコード
henteko/gradle-samplebooks-plugin · GitHub
アップデートしたのでこれを参照してもらいたい
結論
applyメソッド内に以下の様な感じで書いたら出来た
def books = project.container(BookTarget) {
String bookName = it.toString()
def subTask = project.task("${bookName}BookRead", type: SubBookTask)
subTask.group = 'Sample'
subTask.description = "${bookName} book read"
subTask.bookName = bookName
project.extensions.create(it, BookTarget, bookName)
}
def sample = new SampleExtension(books)
project.containerのクロージャー内で、itにより自身(?)を参照することにより、それぞれのbookNameを取得することが出来る
その後、動的にタスクを生成後各タスクに渡すようにsubTask.bookName = bookNameで名前を渡している
ちなみにSubBookTask.groovyはこんな感じ
package com.henteko07.gradle.plugins
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
class SubBookTask extends DefaultTask {
String bookName
@TaskAction
def subBookRead() {
println "your config key: ${project.sample.configKey}"
println ""
def books = project.sampleBooks
for(book in books) {
if(bookName != book.name) continue
println "setting name: ${book.name}"
println "title: ${book.title}"
println "body: ${book.body}"
println ""
}
}
}
bookNameってやつが動的にくる名前となる
bookNameごとにifで振り分けるみたいなことすると、今回の目的が達成出来た