Kiểm tra Gradle Phụ thuộc


81

Tôi có hai dự án, dự án A và dự án B. Cả hai đều được viết bằng groovy và sử dụng gradle làm hệ thống xây dựng của chúng.

Dự án A yêu cầu dự án B. Điều này giữ cho cả mã biên dịch và mã kiểm tra.

Làm cách nào để cấu hình các lớp thử nghiệm của dự án A có quyền truy cập vào các lớp thử nghiệm của dự án B?


Câu trả lời:


106

Bạn có thể hiển thị các lớp kiểm tra thông qua cấu hình 'kiểm tra' và sau đó xác định phụ thuộc testCompile vào cấu hình đó.

Tôi có khối này cho tất cả các dự án java, chứa tất cả mã thử nghiệm:

task testJar(type: Jar, dependsOn: testClasses) {
    baseName = "test-${project.archivesBaseName}"
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testJar
}

Sau đó, khi tôi có mã kiểm tra, tôi muốn truy cập giữa các dự án tôi sử dụng

dependencies {
    testCompile project(path: ':aProject', configuration: 'tests')
}

Đây là dành cho Java; Tôi cho rằng nó cũng sẽ hoạt động tốt cho người chơi.


1
Nếu tôi hiểu câu hỏi của bạn thì có, theo như tôi biết thì bạn sẽ cần phải biên dịch các lớp thử nghiệm để sử dụng chúng làm phụ thuộc.
David Resnick,

1
đối với các phiên bản sau của Gradle (tôi đang sử dụng 1.3) dòng "từ sourceSets.test.classes" nên đọc "từ sourceSets.test.output"
Ben

2
Để kéo trong tất cả các phụ thuộc bắc cầu của các bài kiểm tra là tốt, tôi nói thêm: configurations { tests { extendsFrom testRuntime } }
Ramon

3
Làm thế nào để đạt được điều tương tự cho các lớp androidTest?
X-HuMan

3
không làm việc cho tôi, luôn luôn nhận được -Could not get unknown property 'testClasses'
Pavle

17

Đây là một giải pháp đơn giản hơn không yêu cầu tệp jar trung gian:

dependencies {
  ...
  testCompile project(':aProject').sourceSets.test.output
}

Có nhiều cuộc thảo luận hơn trong câu hỏi này: Sự phụ thuộc của thử nghiệm đa dự án với gradle


7
Điều này phá vỡ tích hợp IDE và bỏ lỡ các phụ thuộc bắc cầu. Nó cũng phá vỡ tính đóng gói của các dự án, vốn luôn là một thói quen xấu.
Stefan Oehme

8

Điều này phù hợp với tôi (Java)

// use test classes from spring-common as dependency to tests of current module
testCompile files(this.project(':spring-common').sourceSets.test.output)
testCompile files(this.project(':spring-common').sourceSets.test.runtimeClasspath)

// filter dublicated dependency for IDEA export
def isClassesDependency(module) {
     (module instanceof org.gradle.plugins.ide.idea.model.ModuleLibrary) && module.classes.iterator()[0].url.toString().contains(rootProject.name)
}

idea {
      module {
          iml.whenMerged { module ->
              module.dependencies.removeAll(module.dependencies.grep{isClassesDependency(it)})
              module.dependencies*.exported = true
          }
      }
  }
.....  
// and somewhere to include test classes 
testRuntime project(":spring-common")

5

Giải pháp trên hoạt động, nhưng không hoạt động với phiên bản mới nhất 1.0-rc3của Gradle.

     task testJar(type: Jar, dependsOn: testClasses) {
       baseName = "test-${project.archivesBaseName}"

       // in the latest version of Gradle 1.0-rc3
       // sourceSets.test.classes no longer works
       // It has been replaced with 
       // sourceSets.test.output

       from sourceSets.test.output
     }

5

Nếu ProjectA chứa mã thử nghiệm mà bạn muốn sử dụng trong ProjectB và ProjectB muốn sử dụng các tạo tác để bao gồm mã thử nghiệm, thì build.gradle của ProjectB sẽ trông giống như sau:

dependencies {

  testCompile("com.example:projecta:1.0.0-SNAPSHOT:tests")

}

Sau đó, bạn cần thêm một archiveslệnh vào artifactsphần trong build.gradle của ProjectA:

task testsJar(type: Jar, dependsOn: testClasses) {
    classifier = 'tests'
    from sourceSets.test.output
}

configurations {
    tests
}

artifacts {
    tests testsJar
    archives testsJar
}

jar.finalizedBy(testsJar)

Bây giờ khi các tạo phẩm của ProjectA được xuất bản cho nghệ sĩ của bạn, chúng sẽ bao gồm một lọ -tests . Sau đó, jar -tests này có thể được thêm vào như một phụ thuộc testCompile cho ProjectB (như hình trên).


0

Đối với Gradle 1.5

task testJar(type: Jar, dependsOn: testClasses) {
    from sourceSets.test.java
    classifier "tests"
}

0

Đối với Android trên phiên bản gradle mới nhất (tôi hiện đang sử dụng 2.14.1), bạn chỉ cần thêm phần bên dưới vào Dự án B để nhận tất cả các phụ thuộc thử nghiệm từ Dự án A.

dependencies {
  androidTestComplie project(path: ':ProjectA')
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.