Skip to content

buildDir非推奨対応

問題

Gradle 8.xではbuildDirプロパティが非推奨化されました。従来buildDir = "$projectDir/out"のようにカスタムビルドディレクトリ(デフォルトのbuildではなくoutを使用)を設定していた場合、次のような警告が表示されます:

'buildDir'プロパティは非推奨です。代わりに'layout.buildDirectory'を使用してください

この非推奨化の背景には、buildDirが持つ以下の課題があります:

  1. 即時評価問題:ビルドロジック実行タイミングと設定変更の整合性問題
  2. 出力位置の不整合:値の読み取り後に変更されると出力先が分岐するリスク
  3. 遅延評価サポート不足:Gradleの最新APIパターンとの非互換性

解決策

👶 基本:buildDirからlayout.buildDirectoryへの置換

非推奨警告を解消する最もシンプルな方法は、buildDirlayout.buildDirectoryに直接置換することです。

groovy
// 非推奨
delete rootProject.buildDir

// 推奨
tasks.register('clean', Delete) {
    delete rootProject.layout.buildDirectory
}

📁 カスタムビルドディレクトリ設定

outのようにデフォルト以外のディレクトリを使用する場合は、layout.buildDirectoryを明示的に設定します。

groovy
// settings.gradleまたはbuild.gradle
layout.buildDirectory.set(layout.projectDirectory.dir("out"))

🔧 タスク内での使用方法

タスク内でビルドディレクトリを参照する場合、適切な型変換が必要です。

kotlin
tasks.register<Copy>("copySchema") {
    // Provider<RegularFile>として取得 → Fileに変換
    val dir = layout.buildDirectory.file("dist/schema").get().asFile
    
    from("src/main/resources/schema")
    into(dir)
}

よくある落とし穴

layout.buildDirectoryProvider型を返すため、直接文字列連結できません。次のような間違いはランタイムエラーを引き起こします:

kotlin
// 誤:Providerを文字列結合すると不正なパスに
into("${layout.buildDirectory}/dist/schema")

// 正:明示的にFile型に変換
into("${layout.buildDirectory.asFile.get()}/dist/schema")

この問題が発生した場合の典型的なエラー:

Cannot access a file in the destination directory

高度なユースケース

マルチプロジェクト全体での設定

ルートプロジェクトとサブプロジェクトで一貫した構成を保つ場合:

groovy
// settings.gradle
rootProject.layout.buildDirectory.dir('../build')

// 各サブプロジェクトに適用
subprojects {
    project.layout.buildDirectory.dir(
        "$rootProject.layout.buildDirectory/$project.name"
    )
}

文字列が必要なコンテキストでの対応

APIが文字列パスを要求する場合のワークアラウンド:

kotlin
// 絶対パスが必要な場合
val absPath = layout.buildDirectory.file("output.txt").get().asFile.toString()

// 相対パスが必要な場合
val relPath = relativePath(layout.buildDirectory.file("output.txt").get().asFile).toString()

ベストプラクティス

  1. プラグイン更新の優先:サードパーティプラグインがlayout.buildDirectory対応しているか確認
  2. 遅延評価の活用.get()を可能な限り遅らせ、設定フェーズで早期取得しない
  3. 一貫した設定:プロジェクト全体で同じパターンを適用
  4. 段階的移行:一度に全置換せず、テストしながら進める

移行の参考資料

公式移行ガイド:Gradle 8.x Upgrading Guide

この移行により、Gradleの最新APIとの互換性が確保され、ビルドの信頼性が向上します。プロジェクトサイズによっては作業量が多くなりますが、段階的なアプローチで確実に移行してください。