gradle 2.0 and beyond - berlin expert daysat #bedcon dependency resolve rules changing dependency...

50
at #bedcon Gradle 2.0 and beyond latest efforts, current status & roadmap

Upload: others

Post on 23-May-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradle2.0andbeyondlatestefforts,currentstatus&roadmap

Page 2: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

RenéGröschkePrincipalEngineer@GradleInc.

@breskeby

breskeby

[email protected]

Page 3: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradleinanutshellcompletelyopensource

apache2licensed

drivenbyGradleInc.

Page 4: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradleinanutshell

Page 5: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradleinanutshell

Page 6: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradleinanutshell

Page 7: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

GradleinanutshellAsimplejavaproject

apply plugin:"java"

version = file("version.txt").text

repositories { jcenter()}

dependencies { testCompile "junit:junit:4.+"}

task printVersion << { println "We're using - version '$version'!" }

Page 8: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradle2.0Released1stJuly2014

Page 9: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradle2.7Released14thSeptember2015

Page 10: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Let’stakeacloserlookonPluginPortal

PlaySupport

GradleTestKit

EvenbetterDependencyManagement

NativeBuildSupportimprovements

EnhancedToolingAPI

Page 11: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

PluginPortal

Page 12: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

PluginPortalII

Page 13: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

PlaySupportDEMO

Page 14: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ContinousMode> gralde build -t

Page 15: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

GradleTestKitFunctionaltestingofyourbuildlogic

def setup() { buildFile = testProjectDir.newFile('build.gradle')}

def "hello world task prints hello world"() { given: buildFile << """ task helloWorld { doLast { println 'Hello world!' } } """

when: def result = GradleRunner.create() .withProjectDir(testProjectDir.root) .withArguments('helloWorld') .build()

then: result.standardOutput.contains('Hello world!') result.task(":helloWorld").outcome == SUCCESS}

Page 16: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencyManagement

Page 17: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencyResolveRulesForcingconsistentversionforagroupoflibraries

configurations.all { resolutionStrategy.eachDependency { DependencyResolveDetails details -> if (details.requested.group == 'org.gradle') { details.useVersion '2.7' } }}

Page 18: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencyResolveRulesUsingacustomversioningscheme

configurations.all { resolutionStrategy { eachDependency { DependencyResolveDetails d -> if (d.requested.version == 'default') { def version = findDefaultVersion(d.requested.group, d.requested.name) d.useVersion version } } }}

Object findDefaultVersion(String group, String name) { // some custom logic that resolves the default // version into a specific version "1.0"}

Page 19: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencyResolveRulesChangingdependencygroupand/ornameattheresolution

configurations.all { resolutionStrategy { eachDependency { DependencyResolveDetails details -> if (details.requested.name == 'groovy-all') { //prefer 'groovy' over 'groovy-all': details.useTarget(group: details.requested.group, name: 'groovy', version: details.requested.version) } if (details.requested.name == 'log4j') { //prefer 'log4j-over-slf4j' over 'log4j', details.useTarget "org.slf4j:log4j-over-slf4j:1.7.10" } } }}

Page 20: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ComponentSelectionRulesdependencies { compile 'org.slf4j:slf4j-api:+' testCompile 'junit:junit:4.11'}

configurations { all { resolutionStrategy { componentSelection { withModule("org.slf4j:slf4j-api") { selection -> if(selection.candidate.version == "1.7.10") { selection.reject("known buggy version") } } } } }}

Page 21: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ArtifactQueryApitask resolveMavenPomFiles << { def componentIds = configurations.compile.incoming.resolutionResult.allDependencies.collect { it.selected.id }

def result = dependencies.createArtifactResolutionQuery() .forComponents(componentIds) .withArtifacts(MavenModule, MavenPomArtifact) .execute()

for(component in result.resolvedComponents) { component.getArtifacts(MavenPomArtifact).each { def pom = new XmlSlurper().parse(it.file) println pom.url } }}

Page 22: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencySubstitutionAllowselasticdependencies

configurations.all { resolutionStrategy.dependencySubstitution { substitute project(":api") with module("org.utils:api:1.3") }}

Page 23: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

BuildshipEclipseplugindevelopedfromscratchbyGradleInc.

Partoftheeclipsefoundation

Wejustleftincubatorstatuslastweek

Shippedaspartofthemars.1release(25.09.2015)

Page 24: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

BuildshipDemo

Page 25: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

CurrentfocusNewGradlemodel

Dependencymanagement

Betterdomainmodelling

Page 26: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Dependencymanagement

Page 27: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Dependencymanagementtodealwithdependencieswehave:

group,name,version

classifier,customivyconfigurations

Page 28: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Dependencymanagementtodealwithdependencieswehave:

group,name,version

classifier,customivyconfigurations

butweneedtodealwith:

java,groovy,scalaversions

android,nativetargetplatforms,allkindofjavascript

Page 29: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Dependencymanagement

Page 30: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencymanagementAllowvariantawaredependencymanagement

Page 31: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

DependencymanagementAllowvariantawaredependencymanagement

Supportarbitrarydimensions+custommetadata

Page 32: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

BetterdomainmodellingDomainmodellingisGradle’sstrength.

Wewantittobeevenbetter.

Page 33: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

BetterdomainmodellingDomainmodellingisGradle’sstrength.

Wewantittobeevenbetter.

Strongermodeling↪TheJARisnotthetaskthatcreatesit.

Cleanermodeling↪Avoidmixingexecutionconcernsintothedatamodel.

Collaborativemodeling↪IknowhowtodosomethingtoJARs.

Comprehensiblemodels↪WhoiscontributingtothecontentsofthisJAR?

Page 34: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

AnewGradlemodel

Page 35: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Thecurrentmodelconfiguration➞execution

Page 36: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Thecurrentmodelconfiguration➞execution

configuration:

input=buildlogic

output=buildmodel

Page 37: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Thecurrentmodelconfiguration➞execution

configuration:

input=buildlogic

output=buildmodel

execution:

input=buildmodel

output=buildartifacts

Page 38: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Limitationsofthecurrentmodel

implementationofdeclarativebuildapiishard

doneintheimperativeway

eagerness

lazyness

hooks

scaling

Page 39: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ToohardForbuildengineersandbuildusers.

Wecandobetter.

Page 40: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ThenewGradlemodelAnewapproachtotheconfigurationphase.

Really,thesamesolutionforthe"executionphase"appliedtoconfiguration.

Agraphofdependentfunctions

Aninterpretabledatamodel

Page 41: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ThenewGradlemodelIEnterRuleSource

class PersonRules extends RuleSource { @Model void person(Person p) {}

@Mutate void setFirstName(Person p) { p.firstName = "John" }

@Mutate void createHelloTask(ModelMap<Task> tasks, Person p) { tasks.create("hello") { doLast { println "Hello $p.firstName $p.lastName!" } } }}

Page 42: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ThenewGradlemodelIIthebuildscript

apply plugin: PersonRules

model { person { lastName = "Smith" }}

Page 43: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ThenewGradlemodelIIIAndroidexperimentalplugin

model { android { compileSdkVersion = 22 buildToolsVersion = "22.0.1"

defaultConfig.with { applicationId = "com.example.user.myapplication" minSdkVersion.apiLevel = 15 targetSdkVersion.apiLevel = 22 versionCode = 1 versionName = "1.0" } }}

Page 44: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

ThenewGradlemodelIVasanenablerfor

buildmuchfasterandmorememoryefficient

justconfigurewhatisrequired

allowfundamentalparallization

providebetterdiagnostics

reusecachedconfiguration

Page 45: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Gradle3.0

Page 46: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

otherfutureplansjigsawsupport

shareddistributedcache

nextlevelnativebuildsupport

moredaemonutilisation

continuedtoolingimprovements

Page 47: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Linksandpointershttps://docs.gradle.org/current/userguide/new_model.html

http://gradle.org/roadmap

http://discuss.gradle.org/c/roadmap

Page 48: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

Q&A

Page 49: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

thanks!

Page 50: Gradle 2.0 and beyond - Berlin Expert Daysat #bedcon Dependency Resolve Rules Changing dependency group and/or name at the resolution configurations.all {resolutionStrategy {eachDependency

at#bedcon

TODOpdfexport→decktape.js

header/footer

makeasciidoctorofflineavailable