Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradle BOM importでライブラリバージョン管理 / DroidKaigi2019

gyamoto
February 08, 2019

Gradle BOM importでライブラリバージョン管理 / DroidKaigi2019

DroidKaigi2019 Day.2 Room3 11:20-11:50(JA / EN 同時通訳)
https://droidkaigi.jp/2019/timetable/70735
https://www.youtube.com/watch?v=bm_szoMkzMo

gyamoto

February 08, 2019
Tweet

More Decks by gyamoto

Other Decks in Technology

Transcript

  1. Gradle BOM import Ͱ

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

    View Slide

  2. ҰॠͰΘ͔Δ 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'
    }

    View Slide

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

    View Slide

  4. View Slide

  5. About teamLab (digital art)

    View Slide

  6. About teamLab (digital art)

    View Slide

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

    View Slide

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

    View Slide

  9. View Slide

  10. View Slide

  11. 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 ?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  15. 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'
    }

    View Slide

  16. 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

    View Slide

  17. 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…"
    }

    View Slide

  18. 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

    View Slide

  19. 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

    View Slide

  20. 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

    View Slide

  21. 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

    View Slide

  22. 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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. 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

    View Slide

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

    View Slide

  29. 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
    }

    View Slide

  30. #
    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
    }

    View Slide

  31. #
    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
    }

    View Slide

  32. #
    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
    }

    View Slide

  33. Dependency management
    • ͪΌΜͱϥΠϒϥϦͷόʔδϣϯΛ؅ཧ͢Δͷ͸ख͕͔͔ؒΔ
    • ϥΠϒϥϦͷόʔδϣϯ͕ζϨ͍ͯͯ΋໰୊ͳ͍͜ͱͷํ͕

    ଟ͍͚Ͳɺى͖Δͱ͖͸ى͖Δ…
    • ඞཁͳ͜ͱͳͷͰ͔ͬ͠Γ΍ͬͯɺ։ൃͷ଍ΛҾͬுΔΑ͏ͳ
    ͜ͱΛආ͚͍ͨ

    View Slide

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

    View Slide

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

    View Slide

  36. Gradle & Android
    • AndroidͷެࣜϏϧυπʔϧͱͯ͠࠾༻
    • Android Plugin for GradleʹΑͬͯΞϓϦͷίϯύΠϧɺ
    ϥΠϒϥϦ/ґଘؔ܎ͷղܾɺςετͷ࣮ߦɺॺ໊ɺ

    ApkͷύοέʔδઃఆͳͲΛఏڙ

    View Slide

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

    View Slide

  38. 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

    View Slide

  39. 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

    View Slide

  40. 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

    View Slide

  41. 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

    View Slide

  42. (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

    View Slide

  43. (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

    View Slide

  44. (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

    View Slide

  45. (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'
    }

    View Slide

  46. (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'
    }

    View Slide

  47. (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

    View Slide

  48. (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

    View Slide

  49. BOM
    \ ͓଴ͨͤ͠·ͨ͠ /

    View Slide

  50. BOM?
    l#0. #JMMTPGNBUFSJBMT
    ͱ͸ɺ

    ੡଄ۀͰ༻͍ΒΕΔ෦඼දͷҰܗଶͰ͋Δɻ

    ੡඼Λ૊ΈཱͯΔ࣌ͷ෦඼ͷҰཡͱɺ

    ৔߹ʹΑͬͯ͸֊૚ߏ଄Λද͢ɻz


    ref: https://ja.wikipedia.org/wiki/BOM_(෦඼ද)

    View Slide

  51. BOM?
    l#0. #JMMTPGNBUFSJBMT
    ͱ͸ɺ

    ੡଄ۀͰ༻͍ΒΕΔ෦඼දͷҰܗଶͰ͋Δɻ

    ੡඼Λ૊ΈཱͯΔ࣌ͷ෦඼ͷҰཡͱɺ

    ৔߹ʹΑͬͯ͸֊૚ߏ଄Λද͢ɻz


    ref: https://ja.wikipedia.org/wiki/BOM_(෦඼ද)

    View Slide

  52. 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ͱͯ͠ࢀরͰ͖Δ

    View Slide

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

    View Slide

  54. 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}

    View Slide

  55. 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}


    View Slide

  56. 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

    View Slide

  57. 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

    View Slide

  58. 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

    View Slide

  59. BOM
    • BOMϑΝΠϧࣗମ΋όʔδϣϯΛ࣋ͭɻ

    ϥΠϒϥϦ܈͕৽͘͠ͳͬͨΒόʔδϣϯΛ্ॻ͖ͯ͠ɺ

    ৽͍͠όʔδϣϯͱͯ͠BOMϑΝΠϧΛެ։͢Δɻ
    • όʔδϣϯ৘ใ͚ͩͳͷͰɺBOMϑΝΠϧΛࢀর͢Δ͜ͱͰ
    ༨෼ͳϥΠϒϥϦ͕௥Ճ͞ΕΔ͜ͱ͸ͳ͍ɻ

    View Slide

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

    View Slide

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

    View Slide

  62. Gradle BOM import

    View Slide

  63. 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

    View Slide

  64. 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

    View Slide

  65. 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

    View Slide

  66. 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

    View Slide

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

    View Slide

  68. 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

    View Slide

  69. 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

    View Slide

  70. Pros 

    Gradle BOM import
    • ϥΠϒϥϦؒͰద੾ͳόʔδϣϯΛఆٛͰ͖Δ

    ʢBOMϑΝΠϧ͕໢ཏ͍ͯ͠ΔϥΠϒϥϦ܈ͷதͰʣ
    • ϥΠϒϥϦ̍ͭ̍ͭʹόʔδϣϯΛॻ͔ͳͯ͘ࡁΉ

    ʢDSLΛ޻෉ͯ͠ఆ਺Λࢀর͠ͳͯ͘Α͘ͳΔʣ

    View Slide

  71. Cons 

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

    View Slide

  72. 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

    View Slide

  73. 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

    View Slide

  74. [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'
    }
    ...
    }

    View Slide

  75. [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

    View Slide

  76. [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 '…'

    View Slide

  77. [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 '…'

    View Slide

  78. [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 '…'


    View Slide

  79. [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 ~

    View Slide

  80. [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 !!

    View Slide

  81. [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 }

    View Slide

  82. [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(…)

    View Slide

  83. [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 '…'

    View Slide

  84. [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 '…'

    View Slide

  85. [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 }

    View Slide

  86. • 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

    View Slide

  87. [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'
    }

    View Slide

  88. [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

    View Slide

  89. Future

    View Slide

  90. Future
    • ϥΠϒϥϦ܈ͷதͰద੾ͳґଘؔ܎Λઃఆ͢ΔͨΊʹɺ

    BOMϑΝΠϧ͕޿·ͬͯ΄͍͠

    ʢJetPack, Firebase, PlayService, etc...ʣ

    View Slide

  91. 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

    View Slide

  92. Q : ࣾ಺ͷશҊ݅Ͱ࢖͍ͬͯΔϥΠϒϥϦͷόʔδϣϯΛ

    BOMͰ؅ཧͰ͖Δʁ
    A : ͢΂ͯͷϥΠϒϥϦ͸ݱ࣮తͰ͸ͳ͍ɻ

    Ҋ݅ʹΑͬͯϥΠϒϥϦͷߋ৽λΠϛϯά͸·ͪ·ͪɻ

    ݱࡏͷ "ϥΠϒϥϦ܈" Ͱ෼͔ΕΔܗ͕ͪΐ͏ͲΑͦ͞͏ɻ
    For Team Develop ?
    Future

    View Slide

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

    View Slide