2010-02-15 39 views
76

Tôi có một tập lệnh chữ viết phức tạp bao bọc một tải các 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.Làm cách nào để nhập một tập lệnh Gradle vào tập lệnh khác?

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

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

Bất cứ ai có thể cho tôi biết cách 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ự với nhiệm vụ của Ant không? Tôi đã trawled tài liệu của Gradle vô ích cho đến nay.

Thông tin cá

Sau phản ứng của Tom dưới đây, tôi nghĩ rằng tôi muốn thử và làm rõ chính xác những gì tôi có ý nghĩa.

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

Vấn đề của tôi là tôi có một số cấu hình ở phía trên cùng của tập tin, 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 ra các nhiệm vụ như:

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

Tôi có rất nhiều các loại các đoạn mã tác vụ, và tất cả chúng đều là 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 điều này trong một kịch bản riêng biệt và nhập nó trong các loại sau đây của cách:

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, tasks.gradle sẽ có tất cả các thế hệ nhiệm vụ chung mã trong và sẽ 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ố tiểu dự án với các tệp xây dựng kiến ​​trúc Netbeans.

+3

Xem xét "áp dụng từ: 'other.gradle'" xây dựng để nhập khai báo bên ngoài. (Xem "12.4. Định cấu hình dự án bằng cách sử dụng tập lệnh xây dựng bên ngoài" tại đây http://gradle.org/0.9-preview-1/docs/userguide/tutorial_this_and_that.html#sec:configuring_using_external_script) –

+0

@PetrGladkikh 'áp dụng từ' ngay lập tức thực thi các nhiệm vụ bên ngoài. Điều này có thể không thích hợp hơn trong logic thực thi (nghĩa là tôi muốn thực hiện các tác vụ khi tôi muốn, không phải ngay lập tức). –

+0

Câu lệnh này trong chú thích ở trên là ** không đúng **: 'apply from' ngay lập tức thực hiện các tác vụ bên ngoài. Đừng bị lừa dối. Các nhiệm vụ bên ngoài được cấu hình, không được thực hiện. – Jarekczek

Trả lời

12

Câu trả lời cho câu hỏi bật ra được trong hệ thống Plugins, nơi bạn có thể thêm các chức năng mong muốn trong một tập hợp các plugins có thể được file groovy nằm ở thư mục buildSrc/src/main/groovy. Plugins cũng có thể được đóng gói như một Jar mặc dù tôi đã không cố gắng này.

Chi tiết tại đây: Custom Plugins

+0

Để bạn biết liên kết bị hỏng - đây là bản cập nhật http://gradle.org/docs/current/userguide/userguide_single.html#sec:configuring_using_external_script – JamesC

+0

Liên kết plugin: http://gradle.org/docs/current/ userguide/userguide_single.html # custom_plugins – JamesC

4

Vâng, thật khó để nói những gì phục vụ bạn tốt nhất mà không thực sự nhìn thấy tệp xây 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 khi 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 gốc dự án của bạn build.gradle bạn xác định tất cả các công cụ cụ thể tên miền của bạn cũng như những điều mà áp dụng cho tất cả tiểu dự án của bạn: thư mục gốc của dự á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() 

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

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

Sau đó, trong tệp bổ sung từ gốc dự án của bạn có tên settings.gradle bạn thực sự trỏ đến tiểu dự án của bạn:

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 phụ của dự án chỉ chứa một nội dung cụ thể của tiểu dự án.

Không có vấn đề gì nếu bạn gọi gradle từ thư mục gốc hoặc dự án tiểu dự án của bạn, 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 không có tác vụ biên dịch nào sẽ được thực hiện cho gốc dự án của bạn miễn là bạn không tải bất kỳ plugin nào vượt quá trình cắm mặc định ở cấp cơ sở.

+1

Cảm ơn bạn đã dành thời gian trả lời. Nó không phải là tiểu dự án tôi đang gặp rắc rối với, nhưng thay vì tạo ra một 'thư viện' của 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ã để làm cho mọi thứ rõ ràng hơn. –

+1

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

+0

Plugin Ivy có thực sự cần thiết ở đây không? Không thể Gradle được sử dụng một mình? –

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