Contenu connexe Similaire à Build Automation Evolved (20) Build Automation Evolved9. Pontos Positivos:
Ant + Ivy
Controle total do build
Flexibilidade
Dependências entre Targets
Muitas targets existentes
Gerenciamento de dependências
9
11. Pontos Fracos:
Ant + Ivy
Ausência de Convenções
Extremamente verboso
Mais imperativo que descritivo
11
12. Pontos Positivos:
Maven
Convenções invés de Configurações
Layout Padrão
Sistema de Plugins
Builds Multi Módulos
Gerenciamento de dependências
12
14. Pontos fracos:
Maven
Convenções extremamente inflexíveis
Integração obrigatória no ciclo de build
Faz download da internet
14
16. Foco em pontos positivos das demais
opções
DSL de Projeto
Voltado para projetos baseados na JVM
Utiliza Groovy
16
20. Gradle
Convenções, mas sempre com a
possibilidade de configuração
Gerenciamento de Dependências
Integração com Ant e Maven
Plugins
Build multi projetos
20
25. Gerenciamento de
Dependências
apply plugin: “java” <?xml version=”1.0” encoding=”UTF-8”?>
repositories { <ivy-module version=”2.0”>
mavenCentral() <info organisation=”br.com.teste.ivy”
} module=”teste-ivy”/>
dependencies { <configurations>
compile “br.com.caelum:vraptor:3.4.1” <conf name=”runtime”/>
testCompile “junit:junit:4.10” <conf name=”test”/>
} </configurations>
<dependencies>
<dependency
<project xmlns=”http://maven.apache.org/POM/4.0.0”
org=”br.com.caelum”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
name=”vraptor”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0
rev=”3.4.1”
http://maven.apache.org/maven-v4_0_0.xsd”>
conf=”runtime->default”
/>!
<modelVersion>4.0.0</modelVersion>
</dependencies>
<groupId>GRUPO</groupId>
</ivy-module>
<artifactId>ATERFATO</artifactId>
<packaging>war</packaging>
<name>Nome</name>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>br.com.caelum</groupId>
<artifactId>vraptor<artifactId>
<version>3.4.1</version>
<dependency>
</dependencies>
25
</project>
26. Gerenciamento de
Dependências
Compatibilidade com repositórios do
Maven e Ivy
Arquivos em disco
Cache
26
27. Gerenciamento de
Dependências
Repositório Central do repositories {
mavenCentral()
Maven: }
Outro Repositório repositories {
mavenRepo url: “http://maven.ow2.org/maven2/”
Maven: }
repositories {
flatDir name: “repositorioEmDisco”, dirs: “lib”
Repositório em Disco: flatDir dirs: [“WEB-INF/lib”, “outroDiretorio”]
}
27
28. Gerenciamento de
Dependências
dependencies {
compile(group:”br.com.caelum”,
Repositório: name:”vraptor”, version:”3.4.1”)
providedCompile “javax.servlet:servlet-api:2.5”
}
dependencies {
Diretório: compile fileTree(dir:“${webAppDirName}/WEB-INF/lib”,
include:”*.jar”)
}
dependencies {
springModules.each {
Código: }
compile “org.springframework:${it}:3.1.0.RELEASE”
}
28
29. Gradle Tasks
Menor unidade de trabalho executada
pelo build
São objetos
Possuem tipos
Fazem parte de um Grafo Direcionado
Acíclico
29
31. Grafo Direcionado
Acíclico
Para qualquer vértice v, não há uma
ligação dirigida começando e terminando
em v
31
34. Gradle tasks
task simpleTask << {
println “I am a simple task”
}
task simpleTask
simpleTask << {
println “Am I what?”
}
simpleTask << {
println “I am a simple Task”
}
34
35. Gradle tasks
Depends On
task dependencyTask << {
println “I’m a dependency”
}
task dependentTask { task dependentTask {
dependsOn “dependencyTask” dependsOn << dependencyTask
} }
task dependentTask { task dependentTask {
dependsOn dependencyTask loadTask.dependsOn dependencyTask
} }
35
36. Gradle tasks
Depends On
task dependencyTask << {
println “I’m a dependency”
}
task dependentTask(dependsOn: dependencyTask) {
doFirst {
task loadTask(dependsOn: dependsTask)
println “first”
}
doLast {
println “last”
}
}
36
37. Gradle tasks
Depends On
Gradle
task dependencyTask << {
println “I’m a dependency”
}
task dependentTask(dependsOn: dependencyTask)
ANT
<target name=”dependencyTarget”>
<echo>everybody depends on me to print anything</echo>
</target>
<target name=”dependentTarget” depends=”dependencyTarget”>
</target>
37
38. Gradle tasks
Task Types
Gradle ANT
apply plugin: “java” <target name=”jar” depends=”compile”>
<delete file=”hello.jar”/>
task myJarTask(type: Jar) { <delete file=”MANIFEST.MF”/>
manifest { <manifest file=”MANIFEST.MF”>
attributes(BuiltBy: “firstValue”, <attribute name=”Built-By”
MainClass: “howTo.Hello”) value=”${user.name}”/>
} <attribute name=”Main-Class”
archiveName: “hello.jar” value=”howto.Hello”/>
destinationDir = file(“${buildDir}/jars”) </manifest>
from sourceSets.main.classes
} <jar destfile=”hello.jar”
basedir=”.”
includes=”**/*.class”
manifest=”MANIFEST.MF”
/>
</target>
38
39. Gradle tasks
Task Types
Gradle ANT
apply plugin: “java” <target name=”jar” depends=”compile”>
apply plugin: “application” <delete file=”hello.jar”/>
mainClassName = “howto.Hello” <delete file=”MANIFEST.MF”/>
<manifest file=”MANIFEST.MF”>
<attribute name=”Built-By”
value=”${user.name}”/>
<attribute name=”Main-Class”
value=”howto.Hello”/>
</manifest>
<jar destfile=”hello.jar”
basedir=”.”
includes=”**/*.class”
manifest=”MANIFEST.MF”
/>
</target>
39
43. Aplicação de Plugins
apply plugin: “java”
apply plugin: org.gradle.api.plugins.JavaPlugin
apply plugin: JavaPlugin
43
45. Outros Plugins
Android Tomcat
AndroidAnnotations MacAppBundle
Artifactory Templates
Cobertura UbuntuPackager
Clojure JSLint
Gwt
45
46. Integração com o Ant
Integração total
Objeto “
ant” exposto
Possível importar um Build completo ou
tasks individualmente
Targets como cidadãos de 1ª classe
46
47. Integração com o Ant
Targets da API padrão funcionam sem
nenhuma firula
Targets externos são facilmente
integrados
Targets passam a ser tratados como
Tasks do Gradle
47
48. Executando Targets Ant
no Gradle
task antEcho << {
ant.echo(message:”this is gradle calling an Ant target”)
}
task antEcho << {
ant.echo ”this is gradle calling an Ant target”
}
:antEcho
[ant:echo] this is gradle calling an Ant target
BUILD SUCCESSFUL
48
49. Executando Targets Ant
no Gradle
configurations {
pmd
}
dependencies {
pmd “pmd:pmd:4.2.5”
}
task check << {
ant.taskdef(name:”pmd”,
classname:”net.sourceforge.pmd.ant.PMDTask”,
classpath: configurations.pmd.asPath)
ant.pmd(shortFilenames: “true”,
failonruleviolation: “true”,
rulesetfiles: file(“pmd-rules.xml”).toURI().toString()) {
formatter(type:”text”, toConsole:”true”)
fileset(dir:”src”)
})
}
49
51. Dependências entre
Target e Tasks
<target name=”antEcho”>
<echo>This is Ant</echo>
</target>
task hello(dependsOn:antEcho) << {
println “and this is Gradle”
}
> gradle hello
:antEcho
[ant:echo] This is Ant
and this is Gradle
BUILD SUCCESSFUL
51
52. GradleWrapper
Permite a utilização do Gradle sem que
pra isso seja preciso instalar o Gradle na
máquina
Pensado para utilização em ser vidores
de integração contínua
52
60. Spring STS Gradle
Support
Import Wizard
Gerenciamento de Dependências
(Semi-)Automatizado
Extensão do Eclipse para Execução de
Tasks do Gradle
59
61. Documentação
Building and Testing with Gradle (http://
gradleware.com/registered-access?content=books/
building-and-testing/)
User Guide (http://gradle.org/docs/current/
userguide/userguide_single.html)
DSL Reference (http://gradle.org/docs/current/dsl/
index.html)
Tutoriais (http://gradle.org/docs/current/
userguide/tutorials.html)
60
Notes de l'éditeur \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n