2013-03-11 46 views
17

Tôi đã có cấu hình gradle khá tốt, xây dựng mọi thứ tốt. Nhưng một trong những dự án xây dựng đa dự án của tôi có nguồn gốc từ phần còn lại của họ rất nhiều, rằng tôi sẽ sẵn sàng chuyển nó sang một repo git khác và cấu hình submodules để xử lý nó.Gradle multiproject cho "Không thể tìm thấy thuộc tính 'sourceSets' trên dự án" lỗi

Trước tiên, tôi đã di chuyển Dự án và tài nguyên của nó tới thư mục con Libraries/MovedProject. Sau khi thay đổi một số dòng trong cấu hình gradle nó làm việc tốt. Nhưng sau đó tôi quyết định viết build.gradle mới chỉ cho dự án này và di chuyển tất cả các cấu hình ở đó từ chính.

Và đây là nơi mọi thứ ngừng hoạt động. Khi tôi cố gắng gọi bất kỳ tác vụ nào, nó luôn kết thúc với Could not find property 'sourceSets' on project ':Libraries/MovedProject'. Dòng chịu trách nhiệm về điều này là:

dependencies { 
    ... 
    if (noEclipseTask) { 
     testCompile project(':Libraries/MovedLibrary').sourceSets.test.output 
    } 
} 

mà tôi sử dụng để chạy các thử nghiệm mà tôi sử dụng các lớp từ các dự án khác. Nếu tôi loại bỏ dòng đó, việc xây dựng không thành công chỉ khi nó đạt đến nhiệm vụ compileTestJava của các dự án sử dụng MovedProject. Nếu tôi loại bỏ dòng đó và gọi gradle :Libraries/MovedLibrary:properties tôi có thể thấy:

... 
sourceCompatibility: 1.7 
sourceSets: [source set main, source set test] 
standardOutputCapture: [email protected] 
... 

khi gradle :Libraries/MovedLibrary:build xây dựng một cách chính xác.

Hiện nay tôi đã có tất cả mọi thứ thiết lập như sau:

  1. thư mục:

    • /SomeMainProject1
    • /SomeMainProject2
    • /SomeMainProject3
    • /Libraries
      • /MovedProject
        • build.gradle
        • dependencies.gradle
        • project.gradle
        • tasks.gradle
    • /Builder
      • dependencies.gradle
      • dự án .gradle
      • tasks.gradle
    • build.gradle
    • settings.gradle
  2. cài đặt.gradle

    include Libraries/MovedProject, 
         SomeMainProject1, 
         SomeMainProject2, 
         SomeMainProject3 
    
  3. sourceSets cho MovedProject được định nghĩa trong Libraries/MovedProject/project.gradle:

    sourceSets { 
        main { 
         java { 
          srcDir 'src' 
          srcDir 'resources' 
         } 
         resources { srcDir 'resources' } 
        } 
        test { java { 
         srcDir 'test/unit' 
        } } 
    } 
    
  4. phụ thuộc mà làm cho sử dụng sourceSets.test.output được lưu trữ trong Builder/dependancies.gradle, và thiết lập cho từng dự án mà cần MovedProject để chạy kiểm tra:

    project(':SomeMainProject1') { 
        dependencies { 
         ... 
    
         if (noEclipseTask) { 
          testCompile project(':Libraries/net.jsdpu').sourceSets.test.output 
         } 
        } 
    } 
    

Điều gì sẽ là cách dễ nhất để loại bỏ lỗi đó và làm cho các dự án xây dựng gradle với cấu trúc thư mục hiện tại? Tôi muốn hiểu tại sao gradle không thể thấy tài sản đó.

Trả lời

14

Dòng đang đề cập là có vấn đề vì nó giả định rằng dự án :Libraries/MovedLibraryđược đánh giá (không được thực hiện) trước dự án hiện tại, có thể không phải như vậy. Và nếu không, các bộ nguồn của dự án khác sẽ không được cấu hình. (Sẽ không có thuộc tính sourceSets vì plugin java-base chưa được áp dụng.)

Nói chung, tốt nhất là không nên tiếp cận với các mô hình dự án của các dự án khác, đặc biệt nếu chúng không phải là con của dự án hiện tại. Trong trường hợp của dự án A sử dụng mã thử nghiệm của dự án B, giải pháp được đề xuất là để dự án B trưng ra một Jar thử nghiệm (qua khối artifacts {}) sau đó được tiêu thụ bởi dự án A.

Nếu bạn muốn giữ mọi thứ là, bạn có thể giải quyết vấn đề bằng cách sử dụng gradle.projectsEvaluated {} hoặc project.evaluationDependsOn(). Xem Gradle Build Language Reference để biết thêm thông tin.

+0

Xin cảm ơn! Bây giờ mọi thứ đều được xây dựng. Đã sử dụng thuộc tính 'project.evaluationDependsOn()' đã sử dụng. Tôi đoán rằng giải pháp là bẩn, nhưng tôi phải dính vào nó một lúc. –

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