Làm cách nào để nhập một tập lệnh Gradle vào một tập lệnh khác?


97

Tôi có một tập lệnh gradle phức tạp bao bọc một lượng chức năng xung quanh việc xây dựng và triển khai một số dự án netbeans cho một số môi trường.

Script hoạt động rất tốt, nhưng về bản chất, tất cả đều được cấu hình thông qua nửa tá bản đồ chứa thông tin về dự án và môi trường.

Tôi muốn tóm tắt các nhiệm vụ vào một tệp khác để tôi có thể đơn giản xác định bản đồ của mình trong một tệp xây dựng đơn giản và nhập các nhiệm vụ từ tệp khác. Bằng cách này, tôi có thể sử dụng các tác vụ cốt lõi tương tự cho một số dự án và định cấu hình các dự án đó bằng một tập bản đồ đơn giản.

Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể nhập một tệp gradle vào một tệp khác, theo cách tương tự như nhiệm vụ của Ant? Cho đến nay, tôi đã dò tìm tài liệu của Gradle mà không có kết quả.

Thông tin bổ sung

Sau câu trả lời của Tom dưới đây, tôi nghĩ mình sẽ cố gắng và làm rõ chính xác ý mình muốn nói.

Về cơ bản, tôi có một tập lệnh gradle chạy một số dự án con. Tuy nhiên, các dự án con đều là dự án Netbeans và đi kèm với các tập lệnh xây dựng kiến ​​của riêng chúng, vì vậy tôi có các nhiệm vụ trong gradle để gọi từng tập lệnh này.

Vấn đề của tôi là tôi có một số cấu hình ở đầu tệp, chẳng hạn như:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Sau đó, tôi tạo các tác vụ như:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

Tôi có nhiều loại đoạn mã tạo nhiệm vụ và tất cả chúng đều chung chung - chúng hoàn toàn phụ thuộc vào cấu hình trong danh sách dự án.

Vì vậy, những gì tôi muốn là một cách để đặt nó trong một tập lệnh riêng biệt và nhập nó theo cách sau:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

Vì vậy, trong ví dụ này, task.gradle sẽ có tất cả mã tạo tác vụ chung và sẽ được chạy cho các dự án được xác định trong tệp build.gradle chính. Theo cách này, task.gradle là một tệp có thể được sử dụng bởi tất cả các dự án lớn bao gồm một số dự án con có tệp xây dựng kiến ​​Netbeans.


3
Hãy xem xét cấu trúc "apply from: 'other.gradle'" để nhập các khai báo bên ngoài. (Xem "12.4. Định cấu hình dự án bằng tập lệnh xây dựng bên ngoài" tại đây gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh

@PetrGladkikh apply fromngay lập tức thực thi các tác vụ bên ngoài. Điều này có thể không thích hợp trong logic thực thi (tức là tôi muốn thực thi các tác vụ khi tôi muốn, không phải ngay lập tức).
IgorGanapolsky

Tuyên bố này trong nhận xét ở trên là không đúng : apply fromngay lập tức thực thi các tác vụ bên ngoài. Đừng để bị hiểu lầm. Các tác vụ bên ngoài được cấu hình, không được thực thi.
Jarekczek

Câu trả lời:



17

Câu trả lời cho câu hỏi hóa ra nằm trong hệ thống Plugin, nơi bạn có thể thêm chức năng mong muốn trong một tập hợp các plugin có thể là các tệp linh hoạt nằm trong thư mục buildSrc/src/main/groovy. Các plugin cũng có thể được đóng gói dưới dạng Jar mặc dù tôi chưa thử điều này.

Chi tiết tại đây: Plugin tùy chỉnh


Mong bạn biết rằng liên kết bị hỏng - đây là bản cập nhật gradle.org/docs/current/userguide/…
JARC


4

Chà, thật khó để biết điều gì phục vụ bạn tốt nhất nếu không thực sự nhìn thấy tệp bản dựng của bạn.

Tôi có thể giả định rằng việc thiết lập môi trường của bạn dưới dạng xây dựng nhiều dự án sẽ cung cấp cho bạn sự trừu tượng mà bạn đang tìm kiếm.

Trong thư mục gốc của dự án, build.gradlebạn xác định tất cả nội dung cụ thể cho miền của mình cũng như những thứ áp dụng cho tất cả các dự án con của bạn:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Thư mục gốc của dự án cũng có thể chứa một gradle.propertiestệp nơi bạn xác định các thuộc tính được sử dụng bởi các dự án của bạn:

buildDirName=staging
repo.dest.dir=/var/repo
...

Sau đó, trong một tệp bổ sung từ gốc dự án của bạn có tên, settings.gradlebạn thực sự trỏ đến các dự án con của mình:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Mỗi thư mục dự án con chứa một build.gradletệp chỉ chứa nội dung cụ thể của dự án con.

Không có vấn đề nếu bạn gọi gradletừ thư mục gốc dự án hoặc thư mục dự án con của mình, gradle sẽ tự động xem xét tất cả các định nghĩa của bạn được thực hiện trong các tệp khác nhau.

Cũng lưu ý rằng sẽ không có tác vụ biên dịch nào được thực thi cho gốc dự án của bạn miễn là bạn không tải bất kỳ plugin nào ngoài plugin mặc định ở cấp gốc.


1
Cảm ơn đã dành thời gian trả lời. Đó không phải là các dự án con mà tôi đang gặp khó khăn, mà là tạo một 'thư viện' các nhiệm vụ phổ biến. Tôi đã chỉnh sửa câu hỏi ban đầu của mình với nhiều thông tin và đoạn mã hơn để làm cho mọi thứ rõ ràng hơn.
Anthony Roy

1
Vì vậy, thay vì thực hiện nhập ("task.gradle") từ mẫu của bạn, bạn sẽ có phần dự án con {} chỉ định mã tạo nhiệm vụ chung được sử dụng bởi tất cả các dự án con của bạn. Điều này sẽ cung cấp cùng một sự trừu tượng mà bạn đang tìm kiếm !?
Tom

Plugin Ivy có thực sự cần thiết ở đây không? Không thể sử dụng Gradle một mình?
IgorGanapolsky
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.