7

我希望使用 Gradle 来构建我的基于 Groovy / Grails 的项目,我们使用 IntelliJ Idea 作为 IDE。

我正在使用 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 配置,您可以从 gradle 进行一些修改.ipr.iml或者尝试使用我的插件之一(请参阅实用程序插件),它将为您完成大部分修改。

于 2012-11-06T00:57:22.003 回答
3

最后我接受了上面的rodion的建议并使用了idea插件。事实证明我第一次尝试时没有正确配置它(仅将插件应用于主项目,而不是子项目)。

我只是在编写自己的任务以更新 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 回答