LoginSignup
3
1

More than 1 year has passed since last update.

タスクをたくさん定義して作業を効率化させてみるぞい!

Posted at

はじめに

package.jsonscriptsにスクリプトを設定して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()に渡したラムダで受け取れるthisJavaExec::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.runtimeClasspathclasspathを設定するようにしていますが、build.gradle.ktsではできません。

build.gradle.ktsでは、classpath = sourceSets["main"].runtimeClasspathで classpathに対して設定を行います。

私の場合は、sourceSets["main"].runtimeClasspathを使わなかった場合に上記のエラーが発生しました。

実行方法

IntelliJ IDEAのgradleウィンドウを開きます。

2.png

再生ボタンのようなアイコンをクリックします。

3.png

自分が定義したタスク名をクリックして、タスクを実行します。

コンソールから実行する場合は./gradlewを使います。

$ ./gradlew HelloTask

まとめ

Kotlinでスクリプト感覚でデータベースへのシード処理などをかけるのはとても便利ですね!
それ専用にプロジェクトを作成したりなどしなくても良いので、積極的にタスクを定義していこうと思います。

参考にした記事

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1