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

Winning the Gradle dependencies

Winning the Gradle dependencies

Working with Gradle dependencies tips and tricks

Avatar for Sergey Boishtyan

Sergey Boishtyan

May 27, 2020

More Decks by Sergey Boishtyan

Other Decks in Programming

Transcript

  1. Кто я • Сергей Боиштян • Работаю в Авито, в

    команде Android Speed • Ускоряем сборку, настраиваем и развиваем инфраструктуру для CI/CD • Twitter: @sboishtyan • Github: sboishtyan 2
  2. Мы вынесли инфру avito- android в open source Доклад Репозиторий

    с инфрой Telegram канал, где можно поспрашивать про инфру 4
  3. 8

  4. 9

  5. Для кого доклад? • Работает на маленьком проекте • Кто

    не заморачивается • Кто хочет заморочится
  6. There are many situations when you want to use the

    latest version of a particular module dependency, or the latest in a range of versions. This can be a requirement during development, or you may be developing a library that is designed to work with a range of dependency versions. Gradle: Handling versions which change over time 17
  7. There are many situations when you want to use the

    latest version of a particular module dependency, or the latest in a range of versions. This can be a requirement during development, or you may be developing a library that is designed to work with a range of dependency versions. Gradle: Handling versions which change over time 18
  8. Варианты общего файла с зависимостями • gradle.properties • Dependencies.kt в

    buildSrc • .gradle в котором лежат все версии • Gradle platform module • Gradle lock dependencies • Gradle dependency resolve rules
  9. Общее место с зависимостями • Простые преимущества • Легко понять,

    какие зависимости, какие версии используем • Автодополнение в build script • Продвинутые преимущества • Ограничить вносить изменения • Валидация для compile, runtime конфигураций
  10. dependencies { api(project(":subprojects:android-test:test-instrumentation-runner")) api(project(":subprojects:android-test:junit-utils")) api(project(":subprojects:android-test:test-report")) api(project(":subprojects:android-test:test-report")) implementation(project(":subprojects:common:sentry")) implementation(project(":subprojects:common:okhttp")) implementation(project(":subprojects:common:statsd")) implementation(project(":subprojects:common:report-viewer"))

    implementation(project(":subprojects:common:logger")) implementation(project(":subprojects:android-test:junit-utils")) implementation(project(":subprojects:android-test:test-annotations")) implementation(project(":subprojects:android-test:ui-testing-core")) implementation(project(":subprojects:android-test:ui-testing-maps")) implementation(Dependencies.androidTest.runner) implementation(Dependencies.test.truth) implementation(Dependencies.test.mockitoKotlin) implementation(Dependencies.okhttpLogging) implementation(Dependencies.test.okhttpMockWebServer) implementation(Dependencies.gson) testImplementation(Dependencies.test.kotlinPoet) testImplementation(Dependencies.test.kotlinCompileTesting) }
  11. 28

  12. 29

  13. 30

  14. 31

  15. 33

  16. 34

  17. 35

  18. 36

  19. 37

  20. Некорректное использование api и implementation • Потребитель получает лишние зависимости

    • Увеличивается время инкрементальной сборки • Неявные зависимости мешают отключить зависимость • Потребитель не получает нужные зависимости • Ломается на этапе компиляции 44
  21. Когда валидируешь зависимости глазами, не знаешь: • Какие зависимости не

    используются • Какие зависимости должны быть api • Какие зависимости должны быть implementation • Какие зависимости используются транзитивно 46
  22. Глаза устали и мы написали Gradle plugin • dependencies-lint находит

    • Неиспользуемые зависимости • Зависимости, из которых используем только транзитивные • Смотрите в нем примеры кода 47
  23. Gradle плагин, который лучше • dependency-analysis-gradle-plugin находит • Неиспользуемые зависимости

    • Зависимости, которые используем транзитивно • Некорректное использование api, implementation, compileOnly 48
  24. Итого • Зависимости влияют на • потребителей • сборку •

    ежедневную работу • релиз • Запомнить все по работе с зависимостями сложно • Автоматизируйте • Если чего то не знаете про Gradle • Приходите к нам в телеграмм • Читайте официальную документацию
  25. Ссылки • Gradle: api and implementation • Gradle: dynamic versions

    • Gradle build scan • Tutorial: Gradle view and debug dependencies • Gradle work with dependencies resolution • Gradle platform module • Gradle lock dependencies • Gradle dependency resolve rules • Доклад, про open source инфры • Наш github • dependencies-lint • Как мы публикуем в bintray • Dependency-analysis-android-gradle-plugin • Доклады от Тинькофф про обратную совместимость • Первый • Второй • Twitter: sboishtyan