第39章 IDEAプラグイン

The IDEA plugin generates files that are used by IntelliJ IDEA, thus making it possible to open the project from IDEA (File - Open Project). Both external dependencies (including associated source and Javadoc files) and project dependencies are considered.

IDEAプラグインは、IntelliJ IDEAが使用するファイルを生成し、プロジェクトをIDEA(File - Open Project)で開けるようにします。 外部依存関係(関連するソースやjavadocファイルを含む)とプロジェクト依存関係についても考慮されています。

What exactly the IDEA plugin generates depends on which other plugins are used:

IDEAプラグインが実際に生成するものは、使用されているプラグインによって異なります。

表39.1 IDEAプラグインの振る舞い IDEA plugin behavior

Plugin プラグインDescription 説明
None なしGenerates an IDEA module file. Also generates an IDEA project and workspace file if the project is the root project. IDEAモジュールファイルを生成する。プロジェクトがルートプロジェクトだった場合は、IDEAプロジェクトとワークスペースファイルも生成する。
Java Adds Java configuration to the module and project files. モジュールファイルとプロジェクトファイルに、Javaの設定を追加する。

One focus of the IDEA plugin is to be open to customization. The plugin provides a standardized set of hooks for adding and removing content from the generated files.

IDEAプラグインで重視されているものの一つがカスタマイズ性です。生成するファイルに内容を追加したり削除したりするためのフックが標準化されて提供されています。

39.1. Usage 使用方法

To use the IDEA plugin, include this in your build script:

IDEAプラグインを使うには、ビルドスクリプトに次の行を追加します。

例39.1 IDEAプラグインを使う

build.gradle

apply plugin: 'idea'

The IDEA plugin adds a number of tasks to your project. The main tasks that you will use are the idea and cleanIdea tasks.

IDEAプラグインは、プロジェクトにいくつかのタスクを追加します。主に使うものはideaタスクとcleanIdeaタスクでしょう。

39.2. タスク Tasks

The IDEA plugin adds the tasks shown below to a project. Notice that the clean task does not depend on the cleanIdeaWorkspace task. This is because the workspace typically contains a lot of user specific temporary data and it is not desirable to manipulate it outside IDEA.

IDEAプラグインはプロジェクトに以下のタスクを追加します。 cleanタスクがcleanIdeaWorkspaceタスクに依存していないことに注意してください。 ワークスペースにはユーザーごとの一時データが多く含まれており、一般的にはIDEAの外からは操作されたくないものだからです。

表39.2 IDEAプラグイン - タスク IDEA plugin - Tasks

Task name タスク名 Depends on 依存先 Type Description 説明
idea ideaProject, ideaModule, ideaWorkspace - Generates all IDEA configuration files 全てのIDEA設定ファイルを生成する。
cleanIdea cleanIdeaProject, cleanIdeaModule Delete Removes all IDEA configuration files IDEAの設定ファイルを全て削除する。
cleanIdeaProject - Delete Removes the IDEA project file IDEAのプロジェクトファイルを削除する。
cleanIdeaModule - Delete Removes the IDEA module file IDEAのモジュールファイルを削除する。
cleanIdeaWorkspace - Delete Removes the IDEA workspace file IDEAのワークスペースファイルを削除する。
ideaProject - GenerateIdeaProject Generates the .ipr file. This task is only added to the root project. .iprファイルを生成する。このタスクはルートプロジェクトのみに追加されます。
ideaModule - GenerateIdeaModule Generates the .iml file .imlファイルを作成する。
ideaWorkspace - GenerateIdeaWorkspace Generates the .iws file. This task is only added to the root project. .iwsファイルを生成する。このタスクはルートプロジェクトのみに追加されます。

39.3. 設定 Configuration

表39.3 IDEAプラグインの設定 Configuration of the idea plugin

Model モデル Reference name 参照名 Description 説明
IdeaModel idea Top level element that enables configuration of the idea plugin in a DSL-friendly fashion DSLフレンドリーな方法でIDEAプラグインの設定を行うための、最上位レベルの要素
IdeaProject idea.project Allows configuring project information プロジェクト情報の設定ができる
IdeaModule idea.module Allows configuring module information モジュールの設定ができる
IdeaWorkspace idea.workspace Allows configuring the workspace XML ワークスペースXMLの設定ができる

39.4. 生成するファイルのカスタマイズ Customizing the generated files

The IDEA plugin provides hooks and behavior for customizing the generated content. The workspace file can effectively only be manipulated via the withXml hook because its corresponding domain object is essentially empty.

IDEAプラグインには、生成される内容をカスタマイズするためのフックと特徴があります。 なお、ワークスペースファイルは、対応するドメインオブジェクトが実質的に空なので、withXmlフックを使用しないと効果的に操作できません。

The tasks recognize existing IDEA files, and merge them with the generated content.

IDEAプラグインのタスクは、既存のIDEAファイルを検知し、生成された内容をそれにマージします。

39.4.1. マージ Merging

Sections of existing IDEA files that are also the target of generated content will be amended or overwritten, depending on the particular section. The remaining sections will be left as-is.

既存のIDEAファイルのセクションのうち、生成される内容の対象になっているものは、セクションごとに修正、または上書きされます。 それ以外のセクションはそのまま残されます。

39.4.1.1. マージを無効にして、完全に上書きする Disabling merging with a complete overwrite

To completely rewrite existing IDEA files, execute a clean task together with its corresponding generation task, like "gradle cleanIdea idea" (in that order). If you want to make this the default behavior, add "tasks.idea.dependsOn(cleanIdea)" to your build script. This makes it unnecessary to execute the clean task explicitly.

既存のIDEAファイルを完全に上書きするには、クリーンタスクを、対応する生成タスクと一緒に使用してください。例えば、gradle cleanIdea ideaをこの順序で使用します。 デフォルトでそのように動作させたいのであれば、tasks.idea.dependsOn(cleanIdea)というコードをビルドスクリプトに追加してください。明示的にクリーンタスクを実行する必要がなくなります。

This strategy can also be used for individual files that the plugin would generate. For instance, this can be done for the “.iml” file with “gradle cleanIdeaModule ideaModule”.

この戦略はプラグインが生成する個々のファイルに対しても適用可能で、例えば “.iml”ファイルに対して" gradle cleanIdeaModule ideaModule"のようにできます。

39.4.2. 生成ライフサイクルへフックする Hooking into the generation lifecycle

The plugin provides objects modeling the sections of the metadata files that are generated by Gradle. The generation lifecycle is as follows:

このプラグインでは、様々なオブジェクトにより生成されるメタデータファイルの各セクションを表現します。 メタデータファイルを生成する際のライフサイクルは次のとおりです。

  1. The file is read; or a default version provided by Gradle is used if it does not exist ファイルが読み込まれる。ファイルが存在しない場合は、Gradleがデフォルトの内容を用意する。
  2. The beforeMerged hook is executed with a domain object representing the existing filebeforeMergedフックが実行され、既存の設定内容を表すドメインオブジェクトがフックに引き渡される。
  3. The existing content is merged with the configuration inferred from the Gradle build or defined explicitly in the eclipse DSL Gradleのビルド内容から推測される、またはDSLで明示された設定内容と、既存の設定内容がマージされる。
  4. The whenMerged hook is executed with a domain object representing contents of the file to be persistedwhenMergedフックが実行され、保存される予定の設定内容を表すドメインオブジェクトがフックに引き渡される。
  5. The withXml hook is executed with a raw representation of the XML that will be persistedwithXmlフックが実行され、保存される予定の生XMLがフックに引き渡される。
  6. The final XML is persisted 最終的なXMLが保存される。

The following table lists the domain object used for each of the model types:

各モデルで使われるドメインオブジェクトは、次の表の通りです。

表39.4 IDEAプラグインフック Idea plugin hooks

Model モデル beforeMerged { arg -> } argument type 引数の型 whenMerged { arg -> } argument type 引数の型 withXml { arg -> } argument type 引数の型
IdeaProject Project Project XmlProvider
IdeaModule Module Module XmlProvider
IdeaWorkspace Workspace Workspace XmlProvider

39.4.2.1. 既存の内容を部分的に上書きする Partial overwrite of existing content

A complete rewrite causes all existing content to be discarded, thereby losing any changes made directly in the IDE. The beforeMerged hook makes it possible to overwrite just certain parts of the existing content. The following example removes all existing dependencies from the Module domain object: 完全な上書きは、既存の内容を全て破棄するので、IDEで直接行った変更も失われてしまいます。 beforeMergedフックを使うと、既存の内容のうち特定の部分だけを上書きすることができます。 次の例では、Moduleドメインオブジェクトから、既存の依存関係を全て削除しています。

例39.2 モジュールの部分的な上書き

build.gradle

idea.module.iml {
    beforeMerged { module ->
        module.dependencies.clear()
    }
}


The resulting module file will only contain Gradle-generated dependency entries, but not any other dependency entries that may have been present in the original file. (In the case of dependency entries, this is also the default behavior.) Other sections of the module file will be either left as-is or merged. The same could be done for the module paths in the project file: 結果として生成されるモジュールファイルには、Gradleが生成した依存関係のエントリのみが含まれており、元のファイルにあった他のエントリは含まれていません(依存関係エントリの場合、これがデフォルトの動作でもあります)。 そして、モジュールファイルの別のセクションはそのまま、またはマージされた状態で残されます。 同じことはプロジェクトファイルのモジュールパスを使用しても実現可能です。

例39.3 プロジェクトの部分的な上書き

build.gradle

idea.project.ipr {
    beforeMerged { project ->
        project.modulePaths.clear()
    }
}


39.4.2.2. 読み込まれた全ドメインオブジェクトを編集する Modifying the fully populated domain objects

The whenMerged hook allows you to manipulate the fully populated domain objects. Often this is the preferred way to customize IDEA files. Here is how you would export all the dependencies of an IDEA module: whenMergedフックを使うと、読み込まれた全てのドメインオブジェクトを操作できます。 IDEAファイルをカスタマイズするときは、多くの場合このフックを使うのが好ましい方法です。例えば、IDEAモジュールの全ての依存関係をエクスポートするには、以下のようにします。

例39.4 Export Dependencies

build.gradle

idea.module.iml {
    whenMerged { module ->
        module.dependencies*.exported = true
    }
}


39.4.2.3. XMLデータを編集する Modifying the XML representation

The withXmlhook allows you to manipulate the in-memory XML representation just before the file gets written to disk. Although Groovy's XML support makes up for a lot, this approach is less convenient than manipulating the domain objects. In return, you get total control over the generated file, including sections not modeled by the domain objects. withXmlフックを使うと、メモリ内のXMLデータを、ファイルに書き出される直前に操作できます。 GroovyのXMLサポートで大幅にフォローされるものの、このアプローチはドメインオブジェクトを操作する方法ほど便利ではありません。 その代わり、ドメインオブジェクトで表現されないような部分も含め、生成されるファイルの全てを制御することができます。

例39.5 XMLをカスタマイズする

build.gradle

idea.project.ipr {
    withXml { provider ->
        provider.node.component
                .find { it.@name == 'VcsDirectoryMappings' }
                .mapping.@vcs = 'Git'
    }
}


39.5. その他の注意事項 Further things to consider

The paths of the dependencies in the generated IDEA files are absolute. If you manually define a path variable pointing to the Gradle dependency cache, IDEA will automatically replace the absolute dependency paths with this path variable. you can configure this path variable via the “idea.pathVariables” property, so that it can do a proper merge without creating duplicates.

生成されるIDEAファイルでは、依存関係が絶対パスで保存されます。 しかし、Gradleキャッシュを場所を参照するパス変数を定義すれば、IDEAは依存関係の絶対パスをそのパス変数で自動的に置き換えます。 そのようなパス変数を使いたい場合は、idea.pathVariablesを使って変数を設定してください。それにより、重複なしで正しくマージを行うこともできます。