Я використовую 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-бібліотеки
Тож я думаю, ти маєш відповідь на всі три запитання.
Я сподіваюсь, це допомагає.