はじめに
package.jsonのscriptsにスクリプトを設定してVSCodeで実行するみたいに、Android Studioでも特定の処理をスクリプトとしてまとめたい!
そんなときに、build.gradleにはタスクという機能があることを知りました。
今回は、Ktorプロジェクトのbuild.gradle.ktsにタスクを定義した時の内容を忘備録としてまとめました。
実行するロジックの定義
scriptsパッケージに、ファイルを作成します。名前はInsertUserTask.ktにしましょう。
そして、ファイル内でmain()
を定義して、実行したロジックを記述します。
もちろん、プロジェクト内の他のクラスにもアクセス可能です。
ここでは、infrastructure
パッケージからデータベース関連のクラスを取得しています。
@file:JvmName("InsertUserTask")
package com.takagimeow.myapplication.scripts
import com.takagimeow.myapplication.infrastructure.database.dao.DatabaseFactory
import com.takagimeow.myapplication.infrastructure.database.dao.impl.UserDAOFacadeImpl
import org.mindrot.jbcrypt.BCrypt
suspend fun main(args: Array<String>) {
val dbUsername = "..."
val dbPassword = "..."
val email = "..."
val password = "..."
val name = "..."
DatabaseFactory.init(
user = dbUsername,
password = dbPassword
)
val dao = UserDAOFacadeImpl()
val hashed = BCrypt.hashpw(password, BCrypt.gensalt())
dao.addNewUser(
email,
hashed,
name,
)
}
タスクの定義
build.gradle.ktsにて、tasks.register()
を呼び出して、タスクを定義します。第一引数にはタスク名。第二引数にはJavaExec::class
を渡します。これにより、register()
に渡したラムダで受け取れるthis
はJavaExec::class
型を表します。
tasks.register("InsertUserTask", JavaExec::class) {
main = "com.takagimeow.myapplication.scripts.InsertUserTask"
classpath = sourceSets["main"].runtimeClasspath
}
java.lang.ClassNotFoundExceptionエラーが出る場合
次のようなエラーが出る場合があります。
> Task :InsertUserTask FAILED
エラー: メイン・クラスcom.takagimeow.myapplication.scripts.InsertUserTaskを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: com.takagimeow.myapplication.scripts.InsertUserTask
ネット上の記事を探すと、build.gradleでの定義方法がたくさん掲載されていて、classpath = sourceSets.main.runtimeClasspath
でclasspath
を設定するようにしていますが、build.gradle.ktsではできません。
build.gradle.ktsでは、classpath = sourceSets["main"].runtimeClasspath
で classpath
に対して設定を行います。
私の場合は、sourceSets["main"].runtimeClasspath
を使わなかった場合に上記のエラーが発生しました。
実行方法
IntelliJ IDEAのgradleウィンドウを開きます。
再生ボタンのようなアイコンをクリックします。
自分が定義したタスク名をクリックして、タスクを実行します。
コンソールから実行する場合は./gradlew
を使います。
$ ./gradlew HelloTask
まとめ
Kotlinでスクリプト感覚でデータベースへのシード処理などをかけるのはとても便利ですね!
それ専用にプロジェクトを作成したりなどしなくても良いので、積極的にタスクを定義していこうと思います。
参考にした記事