gradlefx
DESCRIPTION
Belgian Flex Usergroup presentation by Yennick Trevels from the GradleFX team.TRANSCRIPT
GradleFxFlex Build Tool
By Yennick Trevels & Steven Dick
Yennick TrevelsiDA MediaFoundryJava & Flex
Free TimeProgramming
ReadingGaming
@SlevinBE
GradleAn introduction
GradleFeatures
Convention over ConfigurationMulti-project supportDependency ManagementGroovy scriptingSource file change detection
Gradle
Examplesubprojects { apply plugin: 'gradlefx'
version = '1.0-SNAPSHOT'
repositories { mavenCentral() mavenRepo name: 'yoolab-releases', url: "http://projects.yoolab.org/maven/content/repositories/releases" mavenRepo name: 'yoolab-snapshots', url: "http://projects.yoolab.org/maven/content/repositories/snapshots" }
dependencies { external group: 'org.springextensions.actionscript', name: 'spring-actionscript-core', version: '1.2-SNAPSHOT', ext: 'swc' external group: 'org.as3commons', name: 'as3commons-collections', version: '1.1', ext: 'swc' external group: 'org.as3commons', name: 'as3commons-lang', version: ‘0.3.2', ext: 'swc'
external group: 'org.graniteds', name: 'granite-swc', version: '2.2.0.SP1', ext: 'swc' external group: 'org.graniteds', name: 'granite-essentials-swc', version: ‘2.2.0.SP1', ext: 'swc' }}
Gradle
Projects
One or more projects per buildOne or more tasks per projectOne build.gradle file per project
Gradle
SubprojectsProject structure
Settings file (settings.gradle)
include 'client', 'domain', 'util', 'assets‘
Configuration Injectionsubprojects {
apply plugin: 'gradlefx'version = '1.0-SNAPSHOT'repositories {
mavenCentral()}
}
Gradle
Tasks
Block of code that defines part of a build
Create a new tasktask(showText, dependsOn: ‘projectB:compile’) << {
println “I’m executing after the compile task" }
Configure an existing Tasktask(copy, type: Copy) {
from(file('srcDir')) into(buildDir)
}
Gradle
Tasks
Adding behaviourcompile.doLast {
println “Compilation complete" }
Executing a task>gradle showText
Gradle
MethodsStructure build logic
task(showText) << { printList([‘john’, ‘Alfred’, ‘Elise’])
}
def printList(names) {names.each() { name ->
println name}
}
Gradle
ClassesDefined in
build scriptrootProjectDir/buildSrc/src/main/standalone project
Gradle
Custom task classclass CopyResources extends DefaultTask {
public CopyResources() { description = 'copies the resources to the build directory' }
@TaskAction def copyResources() { project.resourceDirs.each { resourceDir -> def fromLocation = project.file(resourceDir).path def toLocation = project.buildDir.path
logger.info('from ' + fromLocation + ' to ' + toLocation)
project.copy { from fromLocation into toLocation } } }}
Gradle
Convention propertiesProperties exposed by pluginsSimple or complex propertiesHave a default value (convention)Can be overridden
Example:srcDirs = ['src/main/flex'] convention = [‘src/main/actionscript’]htmlWrapper.title = ‘My html wrapper page title‘ default = project name
Gradle
Repositories
repositories { mavenCentral() mavenLocal() mavenRepo name: 'yoolab-releases', url: "http://projects.yoolab.org/maven/content/repositories/releases" mavenRepo name: 'yoolab-snapshots', url: "http://projects.yoolab.org/maven/content/repositories/snapshots"}
Gradle
DependenciesLibraries/other projects used by a project
Library Dependencydependencies {
merged group: 'org.graniteds', name: 'granite-swc', version: graniteds_version, ext: 'swc‘}
Project Dependencymerged project(':projectname')
Gradle
ConfigurationsBundles a set of dependenciesVaries between plugins
merged group: 'org.graniteds', name: 'granite-swc', version: graniteds_version, ext: 'swc‘
‘merged’ configuration
Gradle
Three-phase build
InitializationDetermines projects for buildProject instance creation
Configuration phaseRuns build script of every projectConfigures project objects
Execution phaseExecute the tasks
ProjectInstance {name;
}
ProjectInstance {name = “my project” ;
}
Gradle
Three-phase build
AfterEvaluateRuns after project is configured
project.afterEvaluate {project.description = project.name + “ is my sample project”
}
Gradle
Ant supportAnt project importSupport for Ivy repositoriesRun Ant tasks with Gradle
Exampleant.java(jar: project.flexHome + '/lib/mxmlc.jar', dir: project.flexHome + '/frameworks', fork: true, resultproperty: ‘antResultProperty’, outputproperty: ‘antOutputProperty’) {
arg(value: ‘-keep-as3-metadata+=Autowired,RemoteClass’)}
println ant.properties[‘antOutputProperty’]
Gradle
Maven supportSupport for Maven repositoriesMaven plugin for Java based projects
Gradle
Gradle wrapperRun Gradle without installing Gradlebatch/shell script
How?task wrapper(type: Wrapper) {
gradleVersion = ‘1.0’}
simple/ gradlew gradlew.bat gradle/wrapper/ gradle-wrapper.jar gradle-wrapper.properties
GradleFxFlex builds just got easier!
SWC, SWF & AIRClean & copy resources tasksHtml wrapper generationFlexUnit support
GradleFxFeatures
GradleFx
TaskscleancompilepackagecopyResourcespublishcreateHtmlWrappertest
GradleFx
SetupFlex SDKCreate FLEX_HOME environment variable conventionORSet flexHome convention property custom configuration
Apply Pluginbuildscript { repositories { mavenCentral() }
dependencies { classpath group: 'org.gradlefx', name: 'gradlefx', version: '0.4.1' } }
apply plugin: 'gradlefx'
GradleFx
Project typeDefines to which type of archive the sources will be compiled toConvention property typePossible values ‘swc’, ‘swf’ or ‘air’
Exampletype = ‘swc’
GradleFx
Basic conventionssources src/main/actionscript (srcDirs property)resources src/main/resources (resourceDirs property)test sources src/test/actionscript (testDirs property)test resources src/test/resources (testResourceDirs property)
mxml main class Main.mxml in src/main/actionscript/ (mainClass property)build directory build (project.buildDir property)
GradleFx
Some advanced propertiesCompiler optionsadditionalCompilerOptions propertyOne item per compiler option
additionalCompilerOptions = [ '-use-network=true',
'-locale=en_US', '-keep-as3-metadata+=Autowired,RemoteClass‘]
JVM optionsjvmArguments property
jvmArguments = ['-Xmx1024m','-Xms512m']
GradleFx
Dependency managementConfigurationsMerged (-compiler.library-path)Internal (-compiler.include-libraries)External (-compiler.external-library-path)Rsl (-runtime-shared-library-path)Test
Exampleexternal group: 'org.as3commons', name: 'as3commons-eventbus', version: '1.1', ext: 'swc' merged group: 'org.graniteds', name: 'granite-swc', version: '2.2.0.SP1', ext: 'swc'
GradleFx
AIR project required stepsCreate AIR descriptor fileConvention
"/src/main/actionscript/${project.name}.xml“Custom value
air.applicationDescriptor: "/src/main/flex/airdescriptor.xml“
CertificateNeeded to sign the AIR packagePKCS12 formatPassword required
Convention"${project.name}.p12“
Custom valueair.keystore: "certificate.p12“air.storepass = "mypassword"
GradleFx
FlexUnit required stepsSpecify FlexUnit homeConvention
FLEXUNIT_HOME environment variableCustom value
flexUnit.home = 'c:/flexunit/4.1'
Specify Flash Player executableConvention
FLASH_PLAYER_EXE environment variableCustom value
flexunit.command = ‘c:/flashplayer/flashplayer_10.exe’
Specify FlexUnit ant task jar nameLocated in FlexUnit home directoryCustom value
flexUnit.antTasksJar = 'flexUnitTasks-4.1.0-8.jar'
GradleFx
FlexUnit required stepsSpecify FlexUnit dependenciesdependencies { test files( "${flexUnit.home}/flexunit-4.1.0-8-flex_4.1.0.16076.swc",
"${flexUnit.home}/flexunit-uilistener-4.1.0-8-4.1.0.16076.swc", "${flexUnit.home}/flexunit-cilistener-4.1.0-8-4.1.0.16076.swc“)
}
Specify testRunner classtestClass = 'MyTestRunner.mxml'
GradleFx
DEMO
GradleFx
What’s to come?IDEA and Eclipse project generation supportAS3Doc generationFlex SDK maven artifact support?
GradleFx
Where to go nextGradleFx site: https://github.com/GradleFx/GradleFx
Source: https://github.com/GradleFx/GradleFx
Documentation: https://github.com/GradleFx/GradleFx/wiki
Examples: https://github.com/GradleFx/GradleFx-Examples
Help & Support: http://gradlefx.tenderapp.com/home
Bug tracker: https://github.com/GradleFx/GradleFx/issues
Changelog: https://github.com/GradleFx/GradleFx/blob/master/CHANGELOG.textile