2010-04-02 14 views
41

Chúng tôi có một số bản dựng độc lập (mỗi bản dựng độc lập là một bản dựng nhiều dự án). Các kịch bản xây dựng chính trở nên khá lớn khi chúng tôi có một tập hợp các tác vụ phổ biến được tái sử dụng bởi các dự án con cũng như có nhiều sự lặp lại giữa các bản dựng độc lập. Những gì chúng ta đang tìm kiếm là:Có cách nào để phân chia/yếu tố ra các phần phổ biến của Gradle xây dựng

  1. Một cách để tách chính xây dựng tập tin thành các file nhỏ hơn
  2. Một cách để tái sử dụng một số phần của xây dựng trong độc lập khác được xây dựng

là gì cách tốt nhất để đạt được điều đó trong Gradle?

Trả lời

41

Gradle 0.9 cho phép bạn nhập tập lệnh xây dựng từ tập lệnh xây dựng khác. Hãy xem: Configuring the project using an external build script. Về cơ bản nó là apply from: 'other.gradle'.

Một điều mà hướng dẫn sử dụng không đề cập đến là tham số 'từ' có thể là URL, do đó bạn có thể tạo các tập lệnh được chia sẻ qua HTTP ở đâu đó (ví dụ kho lưu trữ phụ của bạn) và nhập chúng từ nhiều bản dựng.

+0

Cảm ơn bạn đã liên kết. Bạn có nghĩ 0.8 hỗ trợ tính năng đó không? –

+0

Không, đó là một tính năng mới trong 0.9 –

+0

grrrr, liên kết đã bị hỏng, cần tự mình đào bây giờ. –

25

Giải pháp mà tôi tìm thấy ngụ ý ánh xạ những thứ bạn có trong tệp other.gradle của mình.

def getVersionName = { -> 
    def stdout = new ByteArrayOutputStream() 
    exec { 
     commandLine 'git', 'describe', '--tags' 
     standardOutput = stdout 
    } 
    return stdout.toString().trim() 
} 
ext{ 
    VERConsts = [:] 
    VERConsts['NAME'] = getVersionName() 
    VERConsts['NAME_CALL'] = getVersionName 
} 

Sau đó, trong tập tin build.gradle của bạn:

apply from: 'other.gradle' 
// ... 
android { 
    defaultConfig { 
     versionName VERConsts['NAME_CALL']() 
     // or 
     versionName VERConsts['NAME'] 
    } 
} 

Sau đó, versionName sẽ có kết quả cuộc gọi.

Ghi chú:

  • VERConsts['NAME'] = getVersionName() sẽ gọi getVersionName() và lưu trữ kết quả của nó. Sử dụng nó trong tập lệnh của bạn, ví dụ: versionName VERConsts['NAME'] sau đó sẽ chỉ định giá trị được lưu trữ.
  • VERConsts['NAME_CALL'] thay vào đó sẽ lưu trữ tham chiếu đến hàm. Sử dụng VERConsts['NAME_CALL']() trong tập lệnh của bạn sẽ thực sự gọi hàm đó và chỉ định kết quả cho biến số

Giá trị cũ sẽ dẫn đến giá trị khác nhau (ví dụ: nếu ai đó đẩy giá trị khác trong khi tập lệnh của bạn đang chạy).

+0

Tôi thực sự thấy điều này hữu ích hơn so với câu trả lời khác để chia sẻ phương thức trợ giúp tập lệnh xây dựng giữa các dự án. –

+0

Câu trả lời này hữu ích nhất đối với tôi. Cảm ơn! –

+0

bạn có thể cho ví dụ không phải là android không? tên phiên bản VERConsts ['NAME_CALL']() là gì? làm thế nào để chạy nó trong dự án gradle java sạch? – user3871754