/ / Що таке "впровадження" в залежності від Котліна Градле? - android, gradle, android-gradle, kotlin

Що таке "реалізація" в котлінових залежностях Gradle? - андроїд, градле, андроїд-градле, котлін

Я використовую Android Studio 3.0 Preview, щоб запустити новий проект Kotlin. Оскільки я намагаюся додати залежності в build.gradle я бачив implementation сфера замість звичайної compile.

androidTestImplementation("com.android.support.test.espresso:espresso-core:2.2.2", {
exclude group: "com.android.support", module: "support-annotations"
})
implementation "com.android.support:appcompat-v7:25.3.1"
testImplementation "junit:junit:4.12"

Там також androidTestImplementation і testImplementation обсяг

Зрештою, додаю compile додати сторонні залежності, і це працює.

compile "io.reactivex.rxjava2:rxandroid:2.0.1"

Отже, мої запитання ...

  • Що implementation, androidTestImplementation, і testImplementation сфера застосування?
  • Чи все-таки чим compile, testCompile, і androidTestCompile?
  • Який я повинен використовувати для свого проекту Котлін?

Редагувати: Моє погано, це питання не є специфічним для Котліна. Це нове Конфігурація плагіна Android Gradle.

Відповіді:

17 за відповідь № 1

Це не характерно для Котліна, але пов'язане з новим плагіном Gradle для Android.

compile, provided і apk тепер застарілі.
Використовуйте implementation або api замість compile, compileOnly замість provided, і runtimeOnly замість apk.

Причиною цього є пришвидшення складання багатомодульних модулів. Даний модуль A що залежить від модуля B що в свою чергу залежить від модуля C, зміна модуля C викликає перекомпіляцію модуля A так само. Якщо A не використовує C безпосередньо, в цьому немає потреби A перекомпілювати, коли C зміни

The implementation конфігурація забезпечує саме це: якщо ви вкажете implementation project(":C") в BВи не можете отримати доступ C від A і ви уникаєте створення непотрібних модулів. У великому багатомодульному проекті це може заощадити багато часу.

Побачити Перехід на новий плагін Gradle для отримання додаткової інформації.


1 для відповіді № 2

Більш рання версія gradle v3.0.0-alpha1 звикли використовувати compile але він тепер застарілий.

Чому?

Залежності, що з'являються в compile конфігурації будуть піддаватися транзитивному впливуспоживачі бібліотеки і як такі з’являться на компіляційному класі споживачів. З іншого боку, залежності, знайдені в конфігурації реалізації, не піддаватимуться споживачам і, отже, не просочуватимуться у споживач "компілювати класний шлях.

Давайте візьмемо приклад, щоб зрозуміти це. Скажімо, я створив Library_Image_Upload що підтримує Image uploading на сервер. я використав Library_Network ліб в Library_Image_Upload що підтримує всі мережеві операції. Моя бібліотека використовує лише завантаження зображень та забезпечує зручний спосіб завантаження зображень. Тепер, як я раніше Library_Network lib в моїй Library_Image_Upload Проект, кожен, хто користується цією lib, матиме функціональні можливості Image Uploading разом з усіма мережевими операціями що хтось також може використовувати(Важливо). Пізніше я подумав, що є краща альтернатива Library_Network як Library_Magic_Image і використали його. Отже, всі функції API, на які впливає Library_Network пішли і той, хто використовує ці функції, зламав збірку.

implementation має ряд переваг:

  • Залежності більше не просочуються на компільований шлях споживачів, тому ви ніколи не випадково залежите від перехідної залежності
  • Швидше компіляція завдяки зменшеному розміру classpath
  • Менше перекомпіляцій при зміні залежностей від впровадження: споживачам не потрібно було б перекомпілювати
  • Чистіша публікація: коли вони використовуються разом з новим плагіном Maven -publish, бібліотеки Java створюють файли POM, які точно розрізняють те, що потрібно компілювати проти бібліотеки, і те, що потрібно використовувати бібліотеку під час виконання (іншими словами, не змішуйте те, що є необхідна для складання самої бібліотеки і те, що потрібно для складання проти бібліотеки).

Щоб дізнатися більше читайте Плагін Java-бібліотеки

Тож я думаю, ти маєш відповідь на всі три запитання.

Я сподіваюсь, це допомагає.