Slide 1

Slide 1 text

Gradle BOM import Ͱ
 ϥΠϒϥϦόʔδϣϯ؅ཧ Kohei Yamamoto DroidKaigi2019 Day2 11:20-11:50 Room3

Slide 2

Slide 2 text

ҰॠͰΘ͔Δ Gradle BOM import ͰϥΠϒϥϦόʔδϣϯ؅ཧ dependencies { implementation platform('com.squareup.okhttp3:okhttp-bom:3.12.0') implementation 'com.squareup.okhttp3:okhttp' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } dependencies { implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.okhttp3:okhttp-tls:3.12.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0' } ↓

Slide 3

Slide 3 text

Profile Name : Kohei Yamamoto Job : Android Engineer in teamLab GitHub : gyamoto Twitter : farundorl PokemonGo : 3729 7371 0759

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

About teamLab (digital art)

Slide 6

Slide 6 text

About teamLab (digital art)

Slide 7

Slide 7 text

σδλϧΞʔτ͚ͩ͡Όͳͯ͘ɺ \ ࣮͸ŊνʔϜϥϘͬͯ /

Slide 8

Slide 8 text

ΞϓϦ΍WebαʔϏε։ൃ΋ ΍ͬͯ·͢ \ ࣮͸ŊνʔϜϥϘͬͯ /

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Gradle BOM import ͰϥΠϒϥϦόʔδϣϯ؅ཧ 1. Gradle • Gradle & Android • Dependency Management 2. BOM • Gradle BOM Import • [Q] Version Conflict? • [nits] For Gradle 4.6 • [nits] Dependency Constraint 3. Future • For Library Creator • For Team Develop ?

Slide 12

Slide 12 text

Specification • Android Studio : 3.4 Beta3 • Gradle version : 5.1.1 (and 4.6) • Gradle script : Groovy

Slide 13

Slide 13 text

Ͳ͜·Ͱ ϥΠϒϥϦͷόʔδϣϯΛ ؅ཧͯ͠·͔͢ʁ

Slide 14

Slide 14 text

Dependency management • ࡢࠓͷΞϓϦ։ൃͰ͸ϥΠϒϥϦΛ࢖͏͜ͱ͕Ұൠత • ϥΠϒϥϦͷଟ͘͸ϦϙδτϦʹϗεςΟϯά͞Ε͍ͯΔ • Gradleܦ༝ͰґଘੑΛղܾͯ͠ɺϩʔΧϧͰ࣮ߦ͍ͯ͠Δ

Slide 15

Slide 15 text

Level1: def xxx_version = '1.2.3' Dependency management dependencies { // Example: Retrofit (HTTP Client Library) implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' implementation 'com.squareup.retrofit2:converter-moshi:2.5.0' implementation 'com.squareup.retrofit2:retrofit-mock:2.5.0' }

Slide 16

Slide 16 text

Level1: def xxx_version = '1.2.3' Dependency management dependencies { // Example: Retrofit (HTTP Client Library) implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' implementation 'com.squareup.retrofit2:converter-moshi:2.5.0' implementation 'com.squareup.retrofit2:retrofit-mock:2.5.0' } ~~~~~ ~~~~~ ~~~~~ ~~~~~ '2.5.0' x 4

Slide 17

Slide 17 text

Level1: def xxx_version = '1.2.3' Dependency management dependencies { def retrofit_version = '2.5.0' implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit…" implementation "com.squareup.retrofit2:converter-moshi:$retrofit…" implementation "com.squareup.retrofit2:retrofit-mock:$retrofit…" }

Slide 18

Slide 18 text

dependencies { implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-auth:16.1.0' implementation 'com.google.firebase:firebase-perf:16.2.3' implementation 'com.google.firebase:firebase-storage:16.0.5' implementation 'com.google.firebase:firebase-firestore:18.0.0' implementation 'com.google.firebase:firebase-messaging:17.3.4' } app/build.gradle Level2: def version in ext Dependency management

Slide 19

Slide 19 text

dependencies { implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-auth:16.1.0' implementation 'com.google.firebase:firebase-perf:16.2.3' implementation 'com.google.firebase:firebase-storage:16.0.5' implementation 'com.google.firebase:firebase-firestore:18.0.0' implementation 'com.google.firebase:firebase-messaging:17.3.4' } app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… Level2: def version in ext Dependency management

Slide 20

Slide 20 text

dependencies { implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-auth:16.1.0' implementation 'com.google.firebase:firebase-perf:16.2.3' implementation 'com.google.firebase:firebase-storage:16.0.5' implementation 'com.google.firebase:firebase-firestore:18.0.0' implementation 'com.google.firebase:firebase-messaging:17.3.4' } app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… core: 16.0.6 auth: 16.1.0 pref: 16.2.3 storage: 16.0.5 firestore: 18.0.0 messaging: 17.3.4 16.0.2 15.1.0 16.2.0 16.0.0 17.0.0 17.3.2 16.0.3 16.0.0 16.2.1 16.0.2 17.1.5 17.3.3 15.0.2 15.0.0 16.2.3 15.0.2 16.0.0 17.1.0 Level2: def version in ext Dependency management

Slide 21

Slide 21 text

dependencies { implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-auth:16.1.0' implementation 'com.google.firebase:firebase-perf:16.2.3' implementation 'com.google.firebase:firebase-storage:16.0.5' implementation 'com.google.firebase:firebase-firestore:18.0.0' implementation 'com.google.firebase:firebase-messaging:17.3.4' } app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… core: 16.0.6 auth: 16.1.0 pref: 16.2.3 storage: 16.0.5 firestore: 18.0.0 messaging: 17.3.4 16.0.2 15.1.0 16.2.0 16.0.0 17.0.0 17.3.2 16.0.3 16.0.0 16.2.1 16.0.2 17.1.5 17.3.3 15.0.2 15.0.0 16.2.3 15.0.2 16.0.0 17.1.0 Level2: def version in ext Dependency management

Slide 22

Slide 22 text

ext { kotlin_version = '1.3.20' ... firebase_core_version = '16.0.6' firebase_auth_version = '16.1.0' firebase_pref_version = '16.2.3' firebase_storage_version = '16.0.5' firebase_firestore_version = '18.0.0' firebase_messaging_version = '17.3.4' ... } dependencies.gradle Level2: def version in ext Dependency management

Slide 23

Slide 23 text

dependencies { implementation "com.google.firebase:firebase-core:$..." implementation "com.google.firebase:firebase-auth:$..." implementation "com.google.firebase:firebase-perf:$..." implementation "com.google.firebase:firebase-storage:$..." implementation "com.google.firebase:firebase-firestore:$..." implementation "com.google.firebase:firebase-messaging:$..." } app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… Level2: def version in ext Dependency management

Slide 24

Slide 24 text

app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… Level3: define dependencies in ext Dependency management dependencies { implementation "com.google.firebase:firebase-core:$..."ɹɹɹɹ implementation "com.google.firebase:firebase-auth:$..."ɹɹɹɹ implementation "com.google.firebase:firebase-perf:$..."ɹɹɹɹ implementation "com.google.firebase:firebase-storage:$..." implementation "com.google.firebase:firebase-firestore:$..." implementation "com.google.firebase:firebase-messaging:$..." } Group ID Artifact ID Version

Slide 25

Slide 25 text

ext { versions = [ kotlin : '1.3.20', okhttp : '3.12.1', ] depends = [ kotlin : [ stdlib : "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin", junit : "org.jetbrains.kotlin:kotlin-test-junit:$versions.kotlin", ], firebase : [ core : 'com.google.firebase:firebase-core:16.0.6', ... ], dependencies.gradle Level3: define dependencies in ext Dependency management

Slide 26

Slide 26 text

Level3: define dependencies in ext Dependency management dependencies { implementation depends.kotlin.stdlib implementation depends.kotlin.junit implementation depends.firebase.core implementation depends.firebase.auth implementation depends.firebase.pref ... } app/build.gradle, foo/build.gradle, bar/build.gradle, piyo/build.gradle, etc… Add level4

Slide 27

Slide 27 text

Level3: define dependencies in ext Dependency management • DroidKaigi/conference-app-2019 • buildSrcʹGroupID, ArtifactID, VersionΛఆٛ • */build.gradle ͔Β `Dep.Kotlin.stdlibJvm` ͷΑ͏ʹࢀর ref: https://github.com/DroidKaigi/conference-app-2019/blob/master/buildSrc/src/main/java/dependencies/Dep.kt 
 ref: https://github.com/DroidKaigi/conference-app-2019/blob/master/frontend/android/build.gradle

Slide 28

Slide 28 text

Ͳ͜·Ͱ ϥΠϒϥϦͷόʔδϣϯΛ ؅ཧͯ͠·͔͢ʁ

Slide 29

Slide 29 text

Dependency management dependencies { def version = '1.2.3' implementation "group:artifact:$version" } ext { versions = '1.2.3' } dependencies { implementation "group:artifact:$version" } ext { version = '1.2.3' depends = "group.artifact:$version" } dependencies { implementation depends }

Slide 30

Slide 30 text

# Dependency management dependencies { def version = '1.2.3' implementation "group:artifact:$version" } ext { versions = '1.2.3' } dependencies { implementation "group:artifact:$version" } ext { version = '1.2.3' depends = "group.artifact:$version" } dependencies { implementation depends }

Slide 31

Slide 31 text

# Dependency management dependencies { def version = '1.2.3' implementation "group:artifact:$version" } ext { versions = '1.2.3' } dependencies { implementation "group:artifact:$version" } ext { version = '1.2.3' depends = "group.artifact:$version" } dependencies { implementation depends }

Slide 32

Slide 32 text

# Dependency management dependencies { def version = '1.2.3' implementation "group:artifact:$version" } ext { versions = '1.2.3' } dependencies { implementation "group:artifact:$version" } ext { version = '1.2.3' depends = "group.artifact:$version" } dependencies { implementation depends }

Slide 33

Slide 33 text

Dependency management • ͪΌΜͱϥΠϒϥϦͷόʔδϣϯΛ؅ཧ͢Δͷ͸ख͕͔͔ؒΔ • ϥΠϒϥϦͷόʔδϣϯ͕ζϨ͍ͯͯ΋໰୊ͳ͍͜ͱͷํ͕
 ଟ͍͚Ͳɺى͖Δͱ͖͸ى͖Δ… • ඞཁͳ͜ͱͳͷͰ͔ͬ͠Γ΍ͬͯɺ։ൃͷ଍ΛҾͬுΔΑ͏ͳ ͜ͱΛආ͚͍ͨ

Slide 34

Slide 34 text

Gradle \ BOMͷલʹ͓͞Β͍ʂ /

Slide 35

Slide 35 text

Gradle • ΦʔϓϯιʔεͷϏϧυπʔϧ • Groovy or Kotlin DSL • Highly customizable & Fast & Powerful \ Flexible! High Performance! /

Slide 36

Slide 36 text

Gradle & Android • AndroidͷެࣜϏϧυπʔϧͱͯ͠࠾༻ • Android Plugin for GradleʹΑͬͯΞϓϦͷίϯύΠϧɺ ϥΠϒϥϦ/ґଘؔ܎ͷղܾɺςετͷ࣮ߦɺॺ໊ɺ
 ApkͷύοέʔδઃఆͳͲΛఏڙ

Slide 37

Slide 37 text

GradleͰґଘੑͷղܾ Dependency management in Gradle \ ΋ͬͱৄ͘͠ /

Slide 38

Slide 38 text

Dependency management in Gradle android { ... } dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } app/build.gradle

Slide 39

Slide 39 text

Dependency management in Gradle android { ... } dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } app/build.gradle

Slide 40

Slide 40 text

android { ... } dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } app/build.gradle Dependency management in Gradle

Slide 41

Slide 41 text

android { ... } dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } app/build.gradle Dependency management in Gradle

Slide 42

Slide 42 text

(SBEMF #VJME dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } Dependency management in Gradle ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle

Slide 43

Slide 43 text

(SBEMF #VJME dependencies { // 1. Local binary dependency implementation fileTree(dir: 'libs', include: ['*.jar']) // 2. Dependency on the "core" module from this project implementation project(':core') // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } -PDBM'JMF 3FQPTJUPSZ access artifacts Dependency management in Gradle ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle

Slide 44

Slide 44 text

(SBEMF #VJME /FUXPSL dependencies { ... // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' } download artifacts Dependency management in Gradle ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle

Slide 45

Slide 45 text

(SBEMF #VJME .BWFO 3FQPTJUPSZ *WZ 3FQPTJUPSZ /FUXPSL download artifacts Dependency management in Gradle ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle dependencies { ... // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' }

Slide 46

Slide 46 text

(SBEMF #VJME .BWFO 3FQPTJUPSZ *WZ 3FQPTJUPSZ /FUXPSL download artifacts Dependency management in Gradle *.module *.pom ivy.xml module metadata ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle dependencies { ... // 3. Remote binary dependency implementation 'androidx.appcompat:appcompat:1.0.2' }

Slide 47

Slide 47 text

(SBEMF #VJME .BWFO 3FQPTJUPSZ (SBEMF $BDIF *WZ 3FQPTJUPSZ /FUXPSL store/access artifacts download artifacts Dependency management in Gradle *.module *.pom ivy.xml module metadata ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle

Slide 48

Slide 48 text

(SBEMF #VJME .BWFO 3FQPTJUPSZ (SBEMF $BDIF -PDBM'JMF 3FQPTJUPSZ *WZ 3FQPTJUPSZ /FUXPSL store/access artifacts download artifacts access artifacts Dependency management in Gradle *.module *.pom ivy.xml module metadata ref: https://docs.gradle.org/5.1.1/userguide/introduction_dependency_management.html#dependency_management_in_gradle

Slide 49

Slide 49 text

BOM \ ͓଴ͨͤ͠·ͨ͠ /

Slide 50

Slide 50 text

BOM? l#0. #JMMTPGNBUFSJBMT ͱ͸ɺ
 ੡଄ۀͰ༻͍ΒΕΔ෦඼දͷҰܗଶͰ͋Δɻ
 ੡඼Λ૊ΈཱͯΔ࣌ͷ෦඼ͷҰཡͱɺ
 ৔߹ʹΑͬͯ͸֊૚ߏ଄Λද͢ɻz
 
 ref: https://ja.wikipedia.org/wiki/BOM_(෦඼ද)

Slide 51

Slide 51 text

BOM? l#0. #JMMTPGNBUFSJBMT ͱ͸ɺ
 ੡଄ۀͰ༻͍ΒΕΔ෦඼දͷҰܗଶͰ͋Δɻ
 ੡඼Λ૊ΈཱͯΔ࣌ͷ෦඼ͷҰཡͱɺ
 ৔߹ʹΑͬͯ͸֊૚ߏ଄Λද͢ɻz
 
 ref: https://ja.wikipedia.org/wiki/BOM_(෦඼ද)

Slide 52

Slide 52 text

BOM • MavenͰ࢖ΘΕ͍ͯΔPOM(Project Object Model) ͷ֦ு • ؔ࿈ϥΠϒϥϦͷόʔδϣϯΛ·ͱΊͯఆٛ͢Δ࢓૊Έ • OkHttp : okhttp, okhttp-android-support, okhttp-*** • GCP : google-cloud-core, google-cloud-***, etc... • AWS : aws-java-sdk-core, aws-java-sdk-***, etc... • Gradle͔ΒModule metadataͱͯ͠ࢀরͰ͖Δ

Slide 53

Slide 53 text

e.g. 'com.squareup.okhttp3:okhttp-bom:3.12.1' BOM

Slide 54

Slide 54 text

BOM e.g. 'okhttp-bom-3.12.1.pom' 4.0.0 com.squareup.okhttp3 okhttp-bom 3.12.1 pom OkHttp (Bill of Materials) ${project.groupId} okhttp ${project.version} ${project.groupId}.groupId} okhttp-tests ${project.version}

Slide 55

Slide 55 text

BOM e.g. 'okhttp-bom-3.12.1.pom' ${project.groupId} okhttp ${project.version} ${project.groupId} okhttp-tests ${project.version} ${project.groupId} okhttp-android-support ${project.version}

Slide 56

Slide 56 text

BOM e.g. 'com.squareup.okhttp3:okhttp-bom:3.12.1' e.g. okhttp-bom:3.12.1 | (Total: 24 dependencies) ├── okhttp:3.12.1 ├── okhttp-tests:3.12.1 ├── okhttp-android-support:3.12.1 ├── okhttp-apache:3.12.1 ├── okhttp-sse:3.12.1 ├── okhttp-testing-support:3.12.1 ├── okhttp-tls:3.12.1 ├── okhttp-urlconnection:3.12.1 ├── okhttp-logging-interceptor:3.12.1 ├── okhttp-dnsoverhttps:3.12.1

Slide 57

Slide 57 text

BOM e.g. 'com.google.cloud:google-cloud-bom:0.79.0-alpha' e.g. google-cloud-bom | (Total: 154 dependencies) ├── google-cloud-core ├── google-cloud-automl ├── google-cloud-datastore ├── google-cloud-dialogflow ├── google-cloud-pubsub ├── google-cloud-storage ├── proto-google-common-protos ├── proto-google-cloud-iot-v1 ├── grpc-google-common-protos ├── grpc-google-cloud-iot-v1

Slide 58

Slide 58 text

BOM e.g. 'com.amazonaws:aws-java-sdk-pom:1.11.490' e.g. aws-java-sdk-pom | (Total: 167 dependencies) ├── aws-java-sdk-core ├── aws-java-sdk-api-gateway ├── aws-java-sdk-s3 ├── aws-java-sdk-iot ├── aws-java-sdk-lambda ├── aws-java-sdk-appsync ├── aws-java-sdk-mobile ├── aws-java-sdk-greengrass ├── aws-java-sdk-dynamodb ├── aws-java-sdk-cognitoidentity

Slide 59

Slide 59 text

BOM • BOMϑΝΠϧࣗମ΋όʔδϣϯΛ࣋ͭɻ
 ϥΠϒϥϦ܈͕৽͘͠ͳͬͨΒόʔδϣϯΛ্ॻ͖ͯ͠ɺ
 ৽͍͠όʔδϣϯͱͯ͠BOMϑΝΠϧΛެ։͢Δɻ • όʔδϣϯ৘ใ͚ͩͳͷͰɺBOMϑΝΠϧΛࢀর͢Δ͜ͱͰ ༨෼ͳϥΠϒϥϦ͕௥Ճ͞ΕΔ͜ͱ͸ͳ͍ɻ

Slide 60

Slide 60 text

BOM • 2019೥2݄࣌఺Ͱ͸ OkHttp, SpringFramework, AWS, GoogleCloud, JUnit౳ͰBOMϑΝΠϧ͕ఏڙ͞Ε͍ͯΔ • Androidؔ࿈ͷϥΠϒϥϦͰ͸΄ͱΜͲఏڙ͞Εͯͳ͍

Slide 61

Slide 61 text

Gradle BOM import \ ΍ͬͱ͜͜·Ͱ͖ͨ /

Slide 62

Slide 62 text

Gradle BOM import

Slide 63

Slide 63 text

Gradle BOM import • Dependency Version Alignment ͱͯ͠BOM importʹରԠ • Gradle5.0͔Βਖ਼ࣜಋೖ • Gradle4.6͔Βࢼݧಋೖ͞Ε͍ͯΔͷͰ࢖༻Մೳ ref: https://docs.gradle.org/5.0/release-notes.html#dependency-version-alignment
 ref: https://docs.gradle.org/4.6/release-notes.html#bom-import

Slide 64

Slide 64 text

Gradle BOM import dependencies { implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.okhttp3:okhttp-tls:3.12.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0' } app/build.gradle

Slide 65

Slide 65 text

Gradle BOM import dependencies {
 // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' )
 implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.okhttp3:okhttp-tls:3.12.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0' } app/build.gradle

Slide 66

Slide 66 text

Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // define dependencies without versions implementation 'com.squareup.okhttp3:okhttp' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } app/build.gradle

Slide 67

Slide 67 text

͓Θ͔Γ͍͚ͨͩͨͩΖ͏͔ʁ

Slide 68

Slide 68 text

Gradle BOM import dependencies { // ... implementation 'com.squareup.okhttp3:okhttp:3.12.0' implementation 'com.squareup.okhttp3:okhttp-tls:3.12.0' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0' testImplementation 'com.squareup.okhttp3:mockwebserver:3.12.0' } app/build.gradle

Slide 69

Slide 69 text

Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // define dependencies without versions implementation 'com.squareup.okhttp3:okhttp' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } app/build.gradle

Slide 70

Slide 70 text

Pros 
 Gradle BOM import • ϥΠϒϥϦؒͰద੾ͳόʔδϣϯΛఆٛͰ͖Δ
 ʢBOMϑΝΠϧ͕໢ཏ͍ͯ͠ΔϥΠϒϥϦ܈ͷதͰʣ • ϥΠϒϥϦ̍ͭ̍ͭʹόʔδϣϯΛॻ͔ͳͯ͘ࡁΉ
 ʢDSLΛ޻෉ͯ͠ఆ਺Λࢀর͠ͳͯ͘Α͘ͳΔʣ

Slide 71

Slide 71 text

Cons 
 Gradle BOM import • ͦ΋ͦ΋͋·Γීٴͯ͠ͳ͍…

Slide 72

Slide 72 text

ext { depends = [ okhttp : [ bom : 'com.squareup.okhttp3:okhttp-bom:3.12.0', okhttp : 'com.squareup.okhttp3:okhttp', tls : 'com.squareup.okhttp3:okhttp-tls', urlconnection : 'com.squareup.okhttp3:okhttp-urlconnection', logginginterceptor : 'com.squareup.okhttp3:logging-interceptor', mockwebserver : 'com.squareup.okhttp3:mockwebserver', ], ... ] } dependencies.gradle Define dependencies in ext Gradle Bom import

Slide 73

Slide 73 text

dependencies { // import a BOM implementation platform(depends.okhttp.bom) // define dependencies without versions implementation depends.okhttp.okhttp implementation depends.okhttp.okhttp-tls implementation depends.okhttp.okhttp-urlconnection implementation depends.okhttp.logging-interceptor testImplementation depends.okhttp.mockwebserver ... } app/build.gradle Define dependencies in ext Gradle Bom import

Slide 74

Slide 74 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) implementation('com.squareup.okhttp3:okhttp:3.12.1') { because 'Try new release' } ... }

Slide 75

Slide 75 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) implementation('com.squareup.okhttp3:okhttp:3.12.1') { because 'Try new release' } ... } okhttp-bom: 3.12.0 okhttp: 3.12.1

Slide 76

Slide 76 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.0 < okhttp: 3.12.1 implementation platform(…) implementation '…'

Slide 77

Slide 77 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.1 ? okhttp: 3.12.0 implementation platform(…) implementation '…'

Slide 78

Slide 78 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.1 > okhttp: 3.12.0 implementation platform(…) implementation '…'

Slide 79

Slide 79 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation('com.squareup.okhttp3:okhttp:3.12.0') { because 'Try new release' } ... } okhttp-bom: 3.12.1 okhttp: 3.12.0 ~

Slide 80

Slide 80 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation('com.squareup.okhttp3:okhttp:3.12.0') { force = true } ... } okhttp-bom: 3.12.1 !! okhttp: 3.12.0 !!

Slide 81

Slide 81 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation platform( 'com.squareup.okhttp3:okhttp-bom:3.12.1' ) implementation('com.squareup.okhttp3:okhttp:3.12.0') { force = true } ... } 
 okhttp-bom: 3.12.1 < okhttp: 3.12.0 implementation platform(…) implementation('…') { force = true }

Slide 82

Slide 82 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation enforcedPlatform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // this version will be overriden by the one found in the BOM implementation 'com.squareup.okhttp3:okhttp:3.12.1' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } platform(…) → enforcedPlatform(…)

Slide 83

Slide 83 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation enforcedPlatform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // this version will be overriden by the one found in the BOM implementation 'com.squareup.okhttp3:okhttp:3.12.1' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.0 > okhttp: 3.12.1 implementation enforcedPlatform(…) implementation '…'

Slide 84

Slide 84 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation enforcedPlatform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // this version will be overriden by the one found in the BOM implementation 'com.squareup.okhttp3:okhttp:3.12.1' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.1 > okhttp: 3.12.0 implementation enforcedPlatform(…) implementation '…'

Slide 85

Slide 85 text

[Q] Version conflict?
 Gradle BOM import dependencies { // import a BOM implementation enforcedPlatform( 'com.squareup.okhttp3:okhttp-bom:3.12.0' ) // this version will be overriden by the one found in the BOM implementation 'com.squareup.okhttp3:okhttp:3.12.1' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' } 
 okhttp-bom: 3.12.1 < okhttp: 3.12.0 implementation enforcedPlatform(…) implementation('…') { force = true }

Slide 86

Slide 86 text

• Gradle4.6͔Βsettings.gradleʹ௥ه͢Δ͜ͱͰ࢖༻Մೳ ref: https://docs.gradle.org/4.6/release-notes.html#bom-import enableFeaturePreview('IMPROVED_POM_SUPPORT') [nits] For Gradle 4.6
 Gradle BOM import

Slide 87

Slide 87 text

[nits] For Gradle 4.6
 Gradle BOM import dependencies { // import a BOM (Gradle 4.6~) // No `enforced` behavior implementation 'com.squareup.okhttp3:okhttp-bom:3.12.0' // define dependencies without versions implementation 'com.squareup.okhttp3:okhttp' implementation 'com.squareup.okhttp3:okhttp-tls' implementation 'com.squareup.okhttp3:okhttp-urlconnection' implementation 'com.squareup.okhttp3:logging-interceptor' testImplementation 'com.squareup.okhttp3:mockwebserver' }

Slide 88

Slide 88 text

[nits] Dependency constraint (≒ BOM)
 Gradle BOM import dependencies { // define the version of dependencies declared in the build script constraints { implementation('org.apache.httpcomponents:httpclient:4.5.3') { because 'previous versions have a bug impact' } implementation('commons-codec:commons-codec:1.11') } 
 // define dependencies without versions implementation 'org.apache.httpcomponents:httpclient' } ref: https://docs.gradle.org/userguide/managing_transitive_dependencies.html#sec:dependency_constraints

Slide 89

Slide 89 text

Future

Slide 90

Slide 90 text

Future • ϥΠϒϥϦ܈ͷதͰద੾ͳґଘؔ܎Λઃఆ͢ΔͨΊʹɺ
 BOMϑΝΠϧ͕޿·ͬͯ΄͍͠
 ʢJetPack, Firebase, PlayService, etc...ʣ

Slide 91

Slide 91 text

For Library Creator Future ର৅ɿOkHttpͷΑ͏ͳϥΠϒϥϦ܈Λఏڙ͍ͯ͠Δଆ 1. ϥΠϒϥϦͷϦϦʔε࣌ʹBOMϑΝΠϧ(pom.xml)Λ༻ҙ 2. ଞϥΠϒϥϦͱಉ͘͡MavenϦϙδτϦʹΞοϓϩʔυ 3. [IMO] ϥΠϒϥϦͷಋೖઆ໌Ͱ `implementation platform(...)` ref: "Maven Bill Of Materials (BOM) · Issue #4329 · square/okhttp" https://github.com/square/okhttp/issues/4329

Slide 92

Slide 92 text

Q : ࣾ಺ͷશҊ݅Ͱ࢖͍ͬͯΔϥΠϒϥϦͷόʔδϣϯΛ
 BOMͰ؅ཧͰ͖Δʁ A : ͢΂ͯͷϥΠϒϥϦ͸ݱ࣮తͰ͸ͳ͍ɻ
 Ҋ݅ʹΑͬͯϥΠϒϥϦͷߋ৽λΠϛϯά͸·ͪ·ͪɻ
 ݱࡏͷ "ϥΠϒϥϦ܈" Ͱ෼͔ΕΔܗ͕ͪΐ͏ͲΑͦ͞͏ɻ For Team Develop ? Future

Slide 93

Slide 93 text

Gradle BOM import ͰϥΠϒϥϦόʔδϣϯ؅ཧ • BOMϑΝΠϧͰϥΠϒϥϦ܈ͷόʔδϣϯΛἧ͑Δ͜ͱ͕Ͱ͖Δ • ϥΠϒϥϦ܈Λӽ͑ͨґଘؔ܎ʹ͍ͭͯ͸ࠓ·ͰͲ͓Γ • ϥΠϒϥϦ܈ͱҰॹʹBOMϑΝΠϧΛఏڙ͠Α͏ʂ͍ͯͩ͘͠͞ʂ