gradle で Intellij IDEA の copyright 設定を追加する

Versions

  • Intellij IDEA 2020.3
  • Gradle 6.8.1
  • gradle-idea-ext-plugin 0.10

Contents

Copyright を自動で設定したい

Intellij IDEA には バンドルプラグインとして Copyright プラグインというものがあり、各ファイルに copyright 表記を自動的に付与したりしてくれる。

www.jetbrains.com

各種設定や copyright template に埋め込み可能な変数などは以下のリンク先のようになっている。

Copyright Profiles—IntelliJ IDEA

この設定を自プロジェクトに反映し、他の人が参加した時にも設定してほしいが手作業による追加を極力減らしたい、ということを考える。

Intellij IDEA で設定を共有する

調べた限りだと以下のような方法がある。

  • Intellij IDEA で生成された Copyright 設定を共有する
  • gradle buildscript で Intellij IDEA に設定する

Intellij IDEA で生成された Copyright 設定を共有する

Intellij IDEA は .idea ディレクトリ以下を VCS に追加することによって設定を共有可能にしている。

intellij-support.jetbrains.com

Copyright プラグインの設定は .idea/copyright ディレクトリに設定されるためこのファイルを VCS にコミットして共有すると良さそう。

gradle buildscript で Intellij IDEA に設定する

Gradle には bundle の idea plugin があるが、それとは別に idea-ext という jetbrains が開発している gradle plugin がある。

github.com

この plugin は idea plugin よりも細かく設定が追加できるような機能を提供している様子。 そのうち copyright についても設定可能な様子。

https://github.com/JetBrains/gradle-idea-ext-plugin/wiki#copyright

copyright {
  useDefault = "MyDefaultCopyright" // copyright profile to use by default
  profiles {                        // container for named profiles
    MyDefaultCopyright {                      // name of a profile
      notice = "My License text Here"         // license text, usually multi line
      keyword = "keywords"                
    }
    UnusedLicense {
      notice = "Another license text"
    }
}

kotlin DSL の場合はなぜか以下のように しないと Extension of type 'ProjectSettings' does not exist. などで使えない場合があるので これを追加して対応する。これは gradle そのもののコードを見てみると gradle も idea-ext plugin を使っており、 このように対応してる様子。

gradle/gradlebuild.ide.gradle.kts at v6.8.1 · gradle/gradle · GitHub

fun IdeaProject.settings(configuration: ProjectSettings.() -> Unit) = (this as ExtensionAware).configure(configuration)

fun ProjectSettings.copyright(configuration: CopyrightConfiguration.() -> Unit) = (this as ExtensionAware).configure(configuration)
idea {
    module {
        excludeDirs = setOf(layout.projectDirectory.file("intTestHomeDir").asFile)
    }
    project {
        settings {
            configureCopyright()
            configureRunConfigurations()
            doNotDetectFrameworks("android", "web")
        }
    }
}

fun ProjectSettings.configureCopyright() {
    copyright {
        useDefault = GradleCopyright.profileName
        profiles {
            create(GradleCopyright.profileName) {
                notice = GradleCopyright.notice
                keyword = GradleCopyright.keyword
            }
        }
    }
}

Code Reading

Intellij IDEA 側は ConfigurationHandler というクラスのサブクラスで map 形式のデータを受け取っている。 gradle-idea-ext plugin の方も Map を作っているようなので Intellij IDEA 側は何らかの形で gradle から map object を受け取って処理している?

intellij-community/CopyrightConfigurationHandler.kt at idea/203.6682.115 · JetBrains/intellij-community · GitHub

gradle-idea-ext-plugin/Copyright.groovy at 145a351972fae3bf4ce4565ce67f5784a2603f0d · JetBrains/gradle-idea-ext-plugin · GitHub