7

私はGradleを使用して、IDEとしてIntelliJIdeaを使用しているGroovy/Grailsベースのプロジェクトを構築しようとしています。

IntelliJバージョン11.1.4、Gradleバージョン1.2を使用しています。

私のプロジェクトは、さまざまなGroovy&Grailsサブプロジェクトを含むマルチプロジェクトビルドとして構成されています。

これにより、Mavenを介してビルドを管理する場合と同じ種類のIDEサポートが得られることを期待していました。

  • 自動依存関係管理(さまざまなbuild.gradleに追加されたときに新しい依存関係をIntelliJにインポートします)
  • DSLサポートを構築する
  • ビルドタスクの実行
  • ビルドを実行する際のIDEによる基盤となるビルドシステム(gradle)の使用\

ルートbuild.gradleファイルを開いて、プロジェクトをIntelliJにインポートしました。

これまでのところ、私はいくつかの厄介な問題に直面しています。

  1. IntelliJはbuild.gradleファイルの依存関係への変更を認識(またはランダムに認識)していないため、依存関係は更新されていません。
  2. gradleの「idea」プラグインはマルチモジュールプロジェクトでは機能しないようです。

IntelliJ内でGradleをどのように使用していますか?IntelliJ内で依存関係を手動で管理していますか?

4

2 に答える 2

7

Gradleの「idea」プラグインをしばらく使用していますが、非常にうまく機能します。「idea」プラグインは単にIntelliJプロジェクト構成ファイルを生成するため、それを使用して実行できることは多少制限されますが、それでも、IntelliJ gradleサポート(JetGradleのもの)と比較して、より多くの成功を収めています。

Gradleの「idea」プラグインはマルチモジュールプロジェクトで機能しますが、問題はありませんでした。私は常に親プロジェクトの構成をmasterフォルダーに入れます(初期化の章を参照)。これは機能しているようです。ただし、ネストされた構造を試したことはありません。

追加のIntelliJ構成を行うには.ipr.imlgradleからいくつかの調整を行うか、代わりに、ほとんどの調整を行うプラグイン(ユーティリティプラグインを参照)の1つを使用してみてください

于 2012-11-06T00:57:22.003 に答える
3

結局、私は上記のロディオンの提案に行き、アイデアプラグインを使用しました。初めて試したときに正しく構成されていなかったことがわかりました(プラグインはマスタープロジェクトにのみ適用され、サブプロジェクトには適用されませんでした)。

これは、IntelliJプロジェクトの依存関係を更新するための独自のタスクを作成した後でのみわかりました(.ideaディレクトリレイアウトプロジェクト構造に基づく)。メンテナンスが少なくなるのでプラグインを使用しますが、後世のための私の解決策は次のとおりです。

ext {
    intelliJLibraryDir = "$gradle.rootProject.rootDir/.idea/libraries"
    userHomeDir = gradle.gradleUserHomeDir.parent
}


task cleanIntelliJLibraries << {
    ant.delete (includeEmptyDirs: 'true') { 
        fileset(dir: intelliJLibraryDir, includes: '*.xml') 
    }
}


task createIntelliJLibraries(dependsOn: cleanIntelliJLibraries) << {

    // The unique set of dependency artifacts across all subprojects
    def uniqueProjectArtifacts = subprojects.collectMany {
        if (it.configurations.compile) {
            it.configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll { 
                it.moduleVersion.id.group != "my.project" 
            }
        }
        else { [] }
    }.unique()

    // Output a library xml file for each of the dependency artifacts
    uniqueProjectArtifacts.each { artifact ->

        def artifactPath = artifact.file.path                       
        def artifactName = artifact.moduleVersion.id.with { "$group:$name:$version" }

        def intelliJLibraryPath = artifactPath.replace(userHomeDir, '$USER_HOME$')                  
        def intelliJLibraryFileName = "Gradle__$artifactName".replace(':', '_').replace('.','_') + ".xml"

        new File("$intelliJLibraryDir/$intelliJLibraryFileName").withWriter { writer ->

            def dependencyXML = new MarkupBuilder( writer )

            dependencyXML.component (name: "libraryTable") {
                library (name: "Gradle: $artifactName") {
                    CLASSES {
                        root (url: "jar://$intelliJLibraryPath!/")
                    }
                    JAVADOC {}
                    SOURCES {}
                }
            }
        }
    }           
}


task updateIntelliJModules(dependsOn: createIntelliJLibraries) << {

    subprojects.each { project ->

        def root = new XmlSlurper().parse(new File("${project.name}.iml"))

        // Remove the existing dependencies
        root.component.orderEntry.findAll { it.@type == "library" && it.@level == "project" }.replaceNode {}

        // Add in the new dependencies
        if (project.configurations.compile) {

            project.configurations.compile.resolvedConfiguration.resolvedArtifacts.findAll {
                it.moduleVersion.id.group != "my.project"
            }.each { artifact ->
                def artifactName = artifact.moduleVersion.id.with { "Gradle: $group:$name:$version" }

                root.component.appendNode {
                    orderEntry (type: "library", exported: "", name: artifactName, level: "project")
                }
            }

        }

        def outputBuilder = new StreamingMarkupBuilder()

        new File("${project.name}.iml").withWriter { writer ->
            groovy.xml.XmlUtil.serialize(outputBuilder.bind{ mkp.yield root }, writer)
        }
    }
}
于 2012-11-07T10:19:05.737 に答える