Prefácio
Neste artigo, falamos Gradle
sobre outro conceito importanteTask
1. Task
Definição e configuração
1.1 Task
Definição
O primeiro: pode ser task
definido diretamente pela função
O segundo tipo: o TaskContainer
é aquele que circulamos com uma moldura vermelha acima, como criá-lo? Basta chamar o create
método diretamente
Qual é a diferença entre esses dois métodos? De fato, o primeiro método será eventualmente adicionado a TaskContainer
ele, o que é TaskContainer
equivalente à nossa Task
classe de gerenciamento.Como é uma classe de gerenciamento, ela pode ser criada não apenas, vamos ver o código-fonte
@HasInternalProtocol
public interface TaskContainer extends TaskCollection<Task>, PolymorphicDomainObjectContainer<Task> {
...
@Nullable
Task findByPath(String path);
Task getByPath(String path) throws UnknownTaskException;
<T extends Task> T create(String name, Class<T> type, Action<? super T> configuration) throws InvalidUserDataException;
TaskProvider<Task> register(String name, Action<? super Task> configurationAction) throws InvalidUserDataException;
Task replace(String name);
...
Depois de ler o código fonte, descobrimos que é TaskContainer
principalmente para encontrar e adicionar, e raramente usamos outras
1.2 Task
Configuração
Por exemplo, queremos task
configurar o nome e a descrição do grupo para nossos
O primeiro tipo: nós o configuramos diretamente quando definido.O
segundo tipo: chama vários métodos de configuração no bloco de códigos de configuração
Os mesmos agrupamentos task
serão reunidos. Vamos ver
o que podemos task
configurar? Vamos para o Task
código fonte e ver.
2. Task
Execução detalhada
Descobrimos que, quando executamos helloTask
isso task
, ele também imprime helloTask2
o conteúdo de saída. Por que? É muito simples, porque eles são executados na fase de configuração; portanto, como os fazemos executar na fase de execução? Chamada doFirst
ou doLast
método
Vamos ver o resultado
Em primeiro lugar doFirst
e doLast
realmente executados na fase de execução é então realizada do lado de fora doFirst
ou doLast
de ter precedência sobre o fecho, os dois métodos podem gradle
já previstas task
estendida
Abaixo, contaremos nosso build
tempo em combate real
:
- 1. Defina duas variáveis: iniciar o tempo de execução e terminar o tempo de execução; a diferença entre as duas é o resultado que queremos
- 2. Encontre o primeiro a ser executado
task
, chame odoFirst
método e obtenha a hora de início - 3. Encontre o último método executado
task
, executedoLast
, obtenha o horário final - 4. A diferença entre os dois
: imprimimos para ver quanto tempo levará
3. Task
Dependência e ordem de execução
3.1 Task
Dependência
Primeiro, definimos 3. task
Primeiro, não executamos nada e taskC
apenas o produzimos taskC
. Vamos compará-lo com isso mais tarde . O
que queremos fazer para a nossa taskC
dependência especificada?
O primeiro: adicione no momento da definição
dependsOn
, como adicionamosgroup
antes
Adicione várias necessidades para usar a matriz
que executamostaskC
O segundo:
dependsOn
método de chamada
O terceiro: dependência dinâmica
Aqui criaremos mais alguns para demonstraçãotask
Em seguida, usamos TaskContainer
o findAll
método para me encontrar alinhado com o nosso task
e depois taskC
confiar neles
Nós executamostaskC
3.2 Task
entrada e saída
TaskInputs
: A Task
classe de entrada pode ser de qualquer tipo e arquivo de dados
TaskOutputs
: A Task
classe de saída pode ser apenas um arquivo ou uma pasta e também pode ser usada como outra Task
. TaskInputs
Abaixo, escrevemos um pequeno exemplo para aprender esses dois métodos.
Suponha que desejemos produzir um xml
arquivo. O conteúdo inclui o número da versão e as informações da versão. Primeiro,
criamos três novos atributos estendidos:
aqui também precisamos definir um File
, que é nosso release.xml
.
Então começamos a perceber que lemos e recursos de gravação, precisamos criar os dois correspondentes task
, writeTask
e readTask
nós escrevemos writeTask
três atributos Queremos que nossos previamente definidos nos transmitiutask
inputs.property('versionCode', this.versionCode)
inputs.property('versionName', this.versionName)
inputs.property('versionInfo', this.versionInfo)
Especifique também a saída
//为task指定输出
outputs.file this.destFile
Aqui está começar a escrever a lógica real, essa lógica escrita doLast{}
em
task writeTask {
inputs.property('versionCode', this.versionCode)
inputs.property('versionName', this.versionName)
inputs.property('versionInfo', this.versionInfo)
outputs.file this.destFile
doLast {
// 返回一个map
def data = inputs.getProperties()
File file = outputs.getFiles().getSingleFile()
// 将map转为实体对象
def versionMsg = new VersionMsg(data)
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
// 文件中没有内容
if (file.text != null && file.text.size() <= 0) {
// 将xml数据写入到sw中
xmlBuilder.releases { // <releases>
release { // <releases>的子节点<release>
versionCode(versionMsg.versionCode)
// <release>的子节点<versionCode>1.0.0<versionCode>
versionName(versionMsg.versionName)
versionInfo(versionMsg.versionInfo)
}
}
// 将sw里的内容写到文件中
file.withWriter { writer ->
writer.append(sw.toString())
}
} else { // 已经有其它版本信息了
xmlBuilder.release {
versionCode(versionMsg.versionCode)
versionName(versionMsg.versionName)
versionInfo(versionMsg.versionInfo)
}
def lines = file.readLines()
def lengths = lines.size() - 1
file.withWriter { writer ->
lines.eachWithIndex { String line, int index ->
if (index != lengths) {
writer.append(line + '\r\n')
} else if (index == lengths) {
writer.append(sw.toString() + '\r\n')
writer.append(line + '\r\n')
}
}
}
}
}
}
task readTask {
inputs.file destFile
doLast {
def file = inputs.files.singleFile
println file.text
}
}
Em seguida, escreva um teste que task
dependa desses doistask
task taskTest(dependsOn: [writeTask, readTask]) {
doLast {
println '任务执行完毕'
}
}
Aqui é um lugar para nota, a writeTask
ordem de execução é uma prioridade readTask
do
3,3 Task
pela API
ordem designada de execução
mustRunAfter
: Forçado aask
executar após a execução de um ou alguns t .shouldRunAfter
: IgualmustRunAfter
à função, mas não obrigatória.
Aqui criamos alguns task
para praticar
Aqui nós cumprir a ordem taskX
, taskY
, taskZ
a ordem da saída para a virada olhar seguinte,
4. Anexe ao ciclo de vida da construção
Isso é semelhante ao que explicamos antes para obter o tempo de compilação.Aqui executamos nosso projeto personalizado após a compilação do projeto.task
5. Task
Tipo de
Este é preciso ir para gradle
o site oficial para conhecer no
site oficial
site oficial aberto, encontrado no lado esquerdoTask types
Como dissemos antesCopy