2012-11-05 4 views
7

Tôi đang tìm cách sử dụng Gradle để xây dựng dự án Groovy/Grails dựa trên đó chúng tôi đang sử dụng IntelliJ Idea làm IDE.Quản lý các phụ thuộc dự án với Gradle và IntelliJ

Tôi đang sử dụng phiên bản IntelliJ 11.1.4, Phiên bản Gradle 1.2.

Dự án của tôi được định cấu hình dưới dạng bản dựng nhiều dự án với các dự án con Groovy & Grails khác nhau.

Tôi đã hy vọng rằng điều này sẽ cho tôi cùng một loại hỗ trợ IDE rằng tôi sẽ nhận được nếu quản lý xây dựng thông qua Maven, chẳng hạn như:

  • quản lý phụ thuộc tự động (nhập khẩu phụ thuộc mới để IntelliJ khi thêm vào build.gradle khác nhau)
  • xây dựng hỗ trợ DSL
  • thực hiện nhiệm vụ xây dựng
  • Sử dụng hệ thống xây dựng cơ bản (gradle) bởi IDE khi thực hiện xây dựng \

Tôi đã nhập dự án của mình vào IntelliJ bằng cách mở tệp root build.gradle.

Cho đến nay tôi đến lên chống lại một vài vấn đề gây phiền nhiễu:

  1. IntelliJ không nhận ra (hoặc thừa nhận một cách ngẫu nhiên) thay đổi phụ thuộc vào các tập tin build.gradle và do đó phụ thuộc không được cập nhật.
  2. Plugin "ý tưởng" gradle dường như không hoạt động với các dự án đa mô-đun.

Mọi người làm việc với Gradle bên trong IntelliJ như thế nào? Bạn đang quản lý các phụ thuộc theo cách thủ công trong IntelliJ ??

Trả lời

7

Tôi đã sử dụng plugin "ý tưởng" Gradle trong một thời gian và nó hoạt động rất tốt. Vì plugin "ý tưởng" chỉ đơn giản là tạo ra các tệp cấu hình dự án IntelliJ, nó có phần hạn chế trong những gì bạn có thể làm với nó, nhưng tuy nhiên, tôi đã thành công hơn với nó so với hỗ trợ gradelli IntelliJ (JetGradle thing).

Plugin "ý tưởng" Gradle hoạt động với các dự án đa mô-đun, không bao giờ gặp sự cố với điều đó. Tôi luôn đặt cấu hình dự án phụ huynh trong thư mục master (xem Initialization chapter), có vẻ như hoạt động. Chưa bao giờ thử cấu trúc lồng nhau.

Để làm được thêm cấu hình IntelliJ bạn có thể làm một số .ipr.iml mày mò từ gradle, hoặc cách khác hãy thử sử dụng một trong những my plugins (xem Utilities plugin) mà sẽ làm hầu hết các mày mò cho bạn.

3

Cuối cùng tôi đã đi với đề xuất của rodion ở trên và sử dụng plugin ý tưởng. Nó chỉ ra tôi đã không cấu hình nó đúng lần đầu tiên tôi đã thử nó (chỉ áp dụng các plugin cho dự án tổng thể, không tiểu dự án).

Tôi chỉ tìm thấy điều này sau khi viết tác vụ của riêng mình để cập nhật phụ thuộc cho dự án IntelliJ (dựa trên cấu trúc dự án thư mục .idea). Tôi sẽ sử dụng plugin vì sẽ có ít bảo trì hơn, nhưng đây là giải pháp của tôi cho hậu thế và trong trường hợp nó hữu ích cho bất kỳ ai:

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 { [email protected] == "library" && [email protected] == "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) 
     } 
    } 
}