2012-12-08 20 views
9

Gradle có thể gộp nhiều dự án vào một cái bình?Gradle có thể gộp nhiều dự án vào một cái bình?

Tôi biết bạn có thể làm điều đó cho một dự án duy nhất sử dụng một phương pháp như thế này:

task packageTests(type: Jar) { 
    from sourceSets.test.classes 
} 

Nhưng làm thế nào một người zip lên nhiều tiểu dự án thành một lọ?

Tôi cố gắng này và nó không hoạt động:

task packageTests(type: Jar) { 
    from project(':core').sourceSets.main.classes 
    from project(':core:google').sourceSets.test.classes 
    from project(':core:bing').sourceSets.test.classes 
} 
+0

Bạn có thể sử dụng [fatJar] (https://github.com/musketyr/gradle-fatjar-plugin), OneJar, hoặc [ứng dụng zip ] (http://gradle.org/docs/current/userguide/application_plugin.html). –

+0

Tất cả 3 trong số đó là 1 dự án cụ thể. Không ai trong số họ sẽ nén một dự án gốc và tất cả các dự án con của nó. – djangofan

+0

Tất cả chúng hoạt động dựa trên mô hình mà dự án áp dụng để có những người khác là phụ thuộc. –

Trả lời

6

Đây là giải pháp của tôi, đó là một chút đơn giản hơn:

// Create a list of subprojects that you wish to include in the jar. 
def mainProjects = [':apps',':core',':gui',':io'] 
task oneJar(type: Jar , dependsOn: mainProjects.collect{ it+":compileJava"}) { 
    baseName = 'name of jar' 
    from files(mainProjects.collect{ project(it).sourceSets.main.output }) 
} 

Mã đã được thử nghiệm trên Gradle 1.12

+0

Điều này vẫn hoạt động ở cấp độ 3,1. – ndtreviv

7

này nên làm việc cho những gì bạn muốn làm. Điều này sẽ được trong tập tin xây dựng gradle gốc.

subprojects.each { subproject -> evaluationDependsOn(subproject.path)} 

task allJar(type: Jar, dependsOn: subprojects.assemble) { 
    baseName = 'your-base-name' 
    subprojects.each { subproject -> 
     from subproject.configurations.archives.allArtifacts.files.collect { 
     zipTree(it) 
     } 
    } 
} 

Bạn có thể xuất bản này bằng cách thêm nó như là một kho lưu trữ:

artifacts { 
    archives allJar 
} 
+0

Câu trả lời này gần như đã trả lời câu hỏi của tôi. Nó đã cho tôi một số lượng lớn các ý tưởng tôi đã thử nhưng tôi không bao giờ giải quyết nó. Trình biên dịch gradle cho tôi lỗi: Không thể tìm thấy thuộc tính 'lắp ráp' trên dự án. Tôi đã cố gắng để làm việc xung quanh nó theo nhiều cách khác nhau nhưng không thể. Tôi đang sử dụng Gradle 1.2. Tôi vẫn hy vọng và vẫn cố gắng. – djangofan

+0

Bạn có thể thử đọc tài liệu trên Gradle. Có vẻ như bạn là loại sao chép và dán và không có gì đang hoạt động. 'lắp ráp' là thuộc tính mà plugin java cung cấp cho bạn. Nếu một trong các tiểu dự án của bạn không có plugin java, thì bạn sẽ gặp lỗi bạn đã đề cập. –

+0

Tôi có plugin java được thêm vào trong phần "allprojects". Điều đó có nên làm việc cho tất cả các tiểu dự án của tôi không? Trong mọi trường hợp, tôi đã thêm plugin java cụ thể vào dự án đã phàn nàn và nó không giúp ích gì. Tôi sẽ cố gắng đưa một ví dụ đơn giản hơn về GitHub tối nay để được giúp đỡ tốt hơn. – djangofan

3

Giải pháp sau đây khá giống với đề xuất của CaTalyst.X nhưng sử dụng jar tác vụ trực tiếp.

subprojects.each { subproject -> evaluationDependsOn(subproject.path) } 
jar.dependsOn subprojects.tasks['classes'] 
jar { 
    baseName = 'MyApp' 
    manifest { 
    attributes 'Main-Class': 'org.abc.App' 
    } 
    subprojects.each { subproject -> 
    from subproject.sourceSets.main.output.classesDir 
    from subproject.sourceSets.main.output.resourcesDir 
    } 
} 

Nó đã được thử nghiệm chống lại Gradle 2.1 và 2.2.1

Các vấn đề liên quan