Gradle - Nhiệm vụ
Tập lệnh xây dựng Gradle mô tả về một hoặc nhiều Dự án. Mỗi dự án được tạo thành từ các nhiệm vụ khác nhau. Nhiệm vụ là một phần công việc mà một bản dựng thực hiện. Nhiệm vụ có thể là biên dịch một số lớp, lưu trữ các tệp lớp vào thư mục đích riêng biệt, tạo JAR, tạo Javadoc hoặc xuất bản một số thành tựu lên kho lưu trữ.
Chương này giải thích về nhiệm vụ là gì và cách tạo và thực thi một tác vụ.
Xác định nhiệm vụ
Nhiệm vụ là một từ khóa được sử dụng để xác định một nhiệm vụ thành tập lệnh xây dựng. Hãy xem ví dụ sau đại diện cho một nhiệm vụ có tênhello bản in đó tutorialspoint. Sao chép và lưu tập lệnh sau vào một tệp có tênbuild.gradle. Tập lệnh xây dựng này xác định một tên tác vụ hello được sử dụng để in chuỗi điểm hướng dẫn.
task hello {
doLast {
println 'tutorialspoint'
}
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh trên. Bạn nên thực thi điều này khi tệp build.gradle được lưu trữ.
C:\> gradle –q hello
Đầu ra:
tutorialspoint
Bạn có thể đơn giản hóa tác vụ xin chào này bằng cách chỉ định một phím tắt (đại diện cho một biểu tượng <<) đến doLasttuyên bố. Nếu bạn thêm phím tắt này vào tác vụ trênhello nó sẽ giống như tập lệnh sau.
task hello << {
println 'tutorialspoint'
}
Bạn có thể thực thi tập lệnh trên bằng cách sử dụng gradle –q hello chỉ huy.
Dưới đây là một số biến thể trong việc xác định một nhiệm vụ, hãy xem nó. Ví dụ sau xác định một nhiệm vụhello.
Sao chép và lưu mã sau vào build.gradle tập tin.
task (hello) << {
println "tutorialspoint"
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
tutorialspoint
Bạn cũng có thể sử dụng chuỗi cho tên nhiệm vụ. Hãy xem cùng một ví dụ xin chào. Ở đây chúng ta sẽ sử dụng String làm nhiệm vụ.
Sao chép và lưu mã sau vào build.gradle tập tin.
task('hello') << {
println "tutorialspoint"
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
tutorialspoint
Bạn cũng có thể sử dụng cú pháp thay thế để xác định một nhiệm vụ. Đó là sử dụng phương thức create () để xác định một nhiệm vụ. Hãy xem cùng một ví dụ xin chào dưới đây.
Sao chép và lưu đoạn mã dưới đây vào build.gradle tập tin.
tasks.create(name: 'hello') << {
println "tutorialspoint"
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
tutorialspoint
Định vị công việc
Nếu bạn muốn định vị các tác vụ mà bạn đã xác định trong tệp xây dựng, thì bạn phải sử dụng các thuộc tính dự án tiêu chuẩn tương ứng. Điều đó có nghĩa là mỗi tác vụ có sẵn như một thuộc tính của dự án, sử dụng tên tác vụ làm tên thuộc tính.
Hãy xem đoạn mã sau để truy cập các tác vụ dưới dạng thuộc tính.
Sao chép và lưu đoạn mã dưới đây vào build.gradle tập tin.
task hello
println hello.name
println project.hello.name
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
hello
hello
Bạn cũng có thể sử dụng tất cả các thuộc tính thông qua bộ sưu tập nhiệm vụ.
Sao chép và lưu mã sau vào build.gradle tập tin.
task hello
println tasks.hello.name
println tasks['hello'].name
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
hello
hello
Bạn cũng có thể truy cập đường dẫn của nhiệm vụ bằng các tác vụ. Đối với điều này, bạn có thể gọi phương thức getByPath () với một tên tác vụ hoặc một đường dẫn tương đối hoặc một đường dẫn tuyệt đối.
Sao chép và lưu đoạn mã dưới đây vào build.gradle tập tin.
project(':projectA') {
task hello
}
task hello
println tasks.getByPath('hello').path
println tasks.getByPath(':hello').path
println tasks.getByPath('projectA:hello').path
println tasks.getByPath(':projectA:hello').path
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực thi điều này, nơi lưu trữ tệp build.gradle.
C:\> gradle –q hello
Đầu ra:
:hello
:hello
:projectA:hello
:projectA:hello
Thêm phụ thuộc vào công việc
Bạn có thể thực hiện một nhiệm vụ phụ thuộc vào một nhiệm vụ khác có nghĩa là khi một nhiệm vụ được hoàn thành thì chỉ có nhiệm vụ khác sẽ bắt đầu. Mỗi nhiệm vụ được phân biệt với tên nhiệm vụ. Tập hợp các tên nhiệm vụ được tham chiếu bởi bộ sưu tập nhiệm vụ của nó. Để tham chiếu đến một nhiệm vụ trong một dự án khác, bạn nên sử dụng đường dẫn của dự án làm tiền tố cho tên nhiệm vụ tương ứng.
Ví dụ sau đây thêm một phần phụ thuộc từ taskX vào taskY.
Sao chép và lưu đoạn mã dưới đây vào build.gradletập tin. Hãy xem đoạn mã sau.
task taskX << {
println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
println "taskY"
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực hiện điều này, nơibuild.gradle các kho lưu trữ tập tin.
C:\> gradle –q taskY
Đầu ra:
taskX
taskY
Ví dụ trên là thêm sự phụ thuộc vào nhiệm vụ bằng cách sử dụng tên của nó. Có một cách khác để đạt được sự phụ thuộc của nhiệm vụ đó là xác định sự phụ thuộc bằng cách sử dụng một đối tượng Tác vụ.
Chúng ta hãy lấy ví dụ tương tự về taskY phụ thuộc vào taskX nhưng chúng ta đang sử dụng các đối tượng tác vụ thay vì tên tham chiếu tác vụ.
Sao chép và lưu mã sau vào build.gradle tập tin.
task taskY << {
println 'taskY'
}
task taskX << {
println 'taskX'
}
taskY.dependsOn taskX
Thực hiện lệnh sau trong dấu nhắc lệnh. Bạn nên thực thi điều này khi tệp build.gradle được lưu trữ.
C:\> gradle –q taskY
Đầu ra:
taskX
taskY
Ví dụ trên là thêm sự phụ thuộc vào nhiệm vụ bằng cách sử dụng tên của nó. Có một cách khác để đạt được sự phụ thuộc của nhiệm vụ đó là xác định sự phụ thuộc bằng cách sử dụng đối tượng Tác vụ.
Ở đây chúng ta lấy cùng một ví dụ rằng taskY phụ thuộc vào taskX nhưng chúng ta đang sử dụng các đối tượng tác vụ thay vì các tên tham chiếu tác vụ. Hãy nhìn vào nó.
Sao chép và lưu đoạn mã dưới đây vào build.gradletập tin. Hãy xem đoạn mã sau.
task taskX << {
println 'taskX'
}
taskX.dependsOn {
tasks.findAll {
task → task.name.startsWith('lib')
}
}
task lib1 << {
println 'lib1'
}
task lib2 << {
println 'lib2'
}
task notALib << {
println 'notALib'
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Nó thực thi tập lệnh đã cho ở trên. Bạn nên thực hiện điều này, nơibuild.gradle các kho lưu trữ tập tin.
C:\> gradle –q taskX
Đầu ra:
lib1
lib2
taskX
Thêm mô tả vào công việc
Bạn có thể thêm mô tả cho nhiệm vụ của mình. Mô tả này được hiển thị khi thực thiGradle tasks. Điều này có thể thực hiện được bằng cách sử dụng từ khóa mô tả.
Sao chép và lưu mã sau vào build.gradletập tin. Hãy xem đoạn mã sau.
task copy(type: Copy) {
description 'Copies the resource directory to the target directory.'
from 'resources'
into 'target'
include('**/*.txt', '**/*.xml', '**/*.properties')
println("description applied")
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Bạn nên thực thi điều này khi tệp build.gradle được lưu trữ.
C:\> gradle –q copy
Nếu lệnh được thực hiện thành công, bạn sẽ nhận được kết quả sau.
description applied
Bỏ qua nhiệm vụ
Bỏ qua các tác vụ có thể được thực hiện bằng cách chuyển một đóng vị ngữ. Điều này chỉ có thể thực hiện được nếu phương thức của một nhiệm vụ hoặc một lệnh đóngStopExecutionException trước khi công việc thực tế của một nhiệm vụ được thực thi.
Sao chép và lưu mã sau vào build.gradle tập tin.
task eclipse << {
println 'Hello Eclipse'
}
// #1st approach - closure returning true, if the task should be executed, false if not.
eclipse.onlyIf {
project.hasProperty('usingEclipse')
}
// #2nd approach - alternatively throw an StopExecutionException() like this
eclipse.doFirst {
if(!usingEclipse) {
throw new StopExecutionException()
}
}
Thực hiện lệnh sau trong dấu nhắc lệnh. Bạn nên thực thi điều này khi tệp build.gradle được lưu trữ.
C:\> gradle –q eclipse
Cấu trúc nhiệm vụ
Gradle có các giai đoạn khác nhau, khi làm việc với các nhiệm vụ. Trước hết, có một giai đoạn cấu hình, trong đó mã, được chỉ định trực tiếp trong phần đóng của một tác vụ, được thực thi. Khối cấu hình được thực thi cho mọi tác vụ có sẵn và không chỉ cho những tác vụ sau này thực sự được thực thi.
Sau giai đoạn cấu hình, giai đoạn thực thi chạy mã bên trong doFirst hoặc là doLast đóng của các tác vụ đó, mà thực sự được thực thi.