KisaragiEffective.github.io

Yeet.

View on GitHub

build.gradle.ktsのすゝめ

まえがき

Gradle増分コンパイルできて助かるなぁ
→ でもbuild.gradleってタイプセーフじゃないしなぁ (編注: 型はついているものの補完が効かない)
→ そうだbuild.gradle.ktsを使おう
→ IDEAがきっと自動生成してくれるはず
→ してくれねぇ!!!! (死 :innocent:)

ベース

// build.gradle.kts
group = "com.example.yourgroup"
id = "artifact"
// val kotlinVersion = "1.3.71"
plugins {
  java
  // kotlin("jvm") version kotlinVersion
}

project.sourceSets {
    // 実際のソースが格納されているディレクトリ
    getByName("main") {
        java.srcDir("src/main/java")
    }
    // テスト用のディレクトリ
    getByName("test") {
        java.srcDir("src/test/java")
    }
}

tasks.processResources {
    filteringCharset = "UTF-8"
    from(sourceSets.main.get().resources.srcDirs) {
        // なんでも取り込む
        include("**")

        val tokenReplacementMap = mapOf(
                // @キー@がバリューに置き換わるMap
        )

        filter<ReplaceTokens>("tokens" to tokenReplacementMap)
    }
    // プロジェクトのルートからLICENSEというファイルを取り込む
    from(projectDir) { include("LICENSE") }
}


tasks.withType(JavaCompile::class.java).all {
    // 特にWindowsではWindows-31J = CP932 = SJISがデフォルトで
    // 使用されてしまうので負けないように指定しておく
    this.options.encoding = "UTF-8"
}

repositories {
  // ...
}

dependencies {
  // ...
}

repositoriesブロック

gradleになっても、mavenレポジトリからアーティファクトを取ってくるというフローは変わっていない。そのため、repositoriesブロックでどのレポジトリを参照するか設定しておく。

指定例:

// セントラルレポジトリを参照する。
mavenCentral()

// JCenterのレポジトリを参照する。
jcenter()

// Googleのレポジトリを参照する。
google()

// 指定したURLのレポジトリを参照する。
maven {
  url = java.net.URI("http://example.com/some-maven-repo/")
}

dependenciesブロック

一体全体どういうときに何が必要なのかを適当に指定する。 例えば、junitはテストする段階だけに必要で、製品に埋め込む必要はない。 なお、アーティファクトのIDの指定はグループID:アーティファクトID:バージョンによる。

指定例:

// 実行時、jarの実装に依存する
implementation("com.example:artifact:1.0.0")

// テスト時、jarの実装に依存する
testImplementation("com.example:artifact:1.0.0")

// 拡張子がjarで、プロジェクトのルートからの相対パスに存在するファイルをすべて取り込む
implementation(fileTree(mapOf("dir" to "your/path", "include" to arrayOf("*.jar"))))

あとがき

ドキュメントがあまり詳しくなかったので、適当にGitHubで検索して、目grep&頻度解析した。 IDEAさんにはASAPでビルドスクリプトの自動構成をしていただきたい限りだ。