{"id":308101,"date":"2020-08-06T15:01:06","date_gmt":"2020-08-06T15:01:06","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=308101"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=308101","title":{"rendered":"\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 buildSrc \u0432 Gradle"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/514094\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rb\/ed\/wg\/rbedwgjw12jetb3d3ajktzwaoss.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 Gradle \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/organizing_gradle_projects.html#sec:build_sources\">buildSrc<\/a> \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b \u0441\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438 \u0437\u0430\u0434\u0430\u0447, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u041d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 <code>buildSrc<\/code> \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c Gradle \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u043b\u0438\u0448\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e <code>buildSrc<\/code> \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"moy-opyt-konfigurirovaniya-gradle\">\u041c\u043e\u0439 \u043e\u043f\u044b\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Gradle<\/h2>\n<p>  <\/p>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 Gradle \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Android \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Android Studio. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0448\u0435\u0441\u0442\u0438 \u043b\u0435\u0442, \u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043f\u043e\u043c\u043d\u0438\u0442\u0435 Eclipse \u0441 Android-\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u043c. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044d\u0442\u0430 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f <a href=\"https:\/\/android-developers.googleblog.com\/2015\/06\/an-update-on-eclipse-android-developer.html\">\u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439 \u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0442\u043e \u0432\u0440\u0435\u043c\u044f Gradle \u0438 Groovy \u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043c\u0430\u0433\u0438\u0435\u0439 (\u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043a\u0430\u0436\u0443\u0442\u0441\u044f) \u0438 \u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434 \u0441\u043e Stack Overflow. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0440\u0435\u0434\u043a\u043e \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0441\u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>build.gradle<\/code>.<\/p>\n<p>  <\/p>\n<p>\u042f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u0434\u043b\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u043d\u0438\u0445 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0432\u0441\u044e \u043c\u0430\u0433\u0438\u044e \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>build.gradle<\/code> \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u041c\u0435\u0442\u043e\u0434 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u044f\u0445. \u041f\u043e\u0437\u0434\u043d\u0435\u0435 \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0444\u0430\u0439\u043b <code>build.gradle<\/code> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/build.gradle  public void configureAndroid(Project project) {   project.android {     compileSdkVersion 9   } }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/app\/build.gradle  configureAndroid(this)  android {   \/\/ Module specific configuration }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u043b\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u043d\u043e \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e. \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0444\u0430\u0439\u043b <code>build.gradle<\/code> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435. \u041a\u043e\u0433\u0434\u0430 \u0432 \u043c\u043e\u0434\u0443 \u0432\u043e\u0448\u043b\u0430 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u0438 <code>data<\/code>, <code>core<\/code>, <code>domain<\/code> \u0438 <code>presentation<\/code>, \u044f \u043e\u0442\u043a\u0440\u044b\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434: \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b Gradle \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u0445. <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/android.gradle  project.android {   compileSdkVersion 9 }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/app\/build.gradle  apply from: '..\/android.gradle'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u043c\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 IDE, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u0412 <code>build.gradle<\/code> \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u043b\u043e\u043a\u0430 <code>plugins { }<\/code>, \u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043e\u043d \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. <\/p>\n<p>  <\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441, \u0433\u043e\u0434\u044b \u0441\u043f\u0443\u0441\u0442\u044f, \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/organizing_gradle_projects.html#sec:build_sources\">buildSrc<\/a> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u043c\u043d\u043e\u0433\u0438\u0445 \u043b\u0435\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <code>buildSrc<\/code> \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441\u0442\u0430\u043b\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0441\u0447\u0430\u0441\u0442\u044c\u0435\u043c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 JVM-\u044f\u0437\u044b\u043a, \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 IDE. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u0430\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JUnit \u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430) \u0438\u043b\u0438 <a href=\"https:\/\/guides.gradle.org\/testing-gradle-plugins\">\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Gradle \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u041d\u0435\u0443\u0436\u0442\u043e \u043c\u044b, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u0448\u043b\u0438 \u0441\u0432\u044f\u0442\u043e\u0439 \u0413\u0440\u0430\u0430\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Gradle?!<\/p>\n<p>  <\/p>\n<h2 id=\"nedostatok-buildsrc\">\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a <code>buildSrc<\/code><\/h2>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0431\u0438\u043b\u0438\u0435\u043c \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438 \u043e\u0434\u0438\u043d \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a. \u041b\u044e\u0431\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>buildSrc<\/code> \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f remote \u043a\u0435\u0448, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435. \u0412 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044d\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0441 \u0441\u043e\u0442\u043d\u044f\u043c\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 Gradle \u0434\u0435\u043b\u0430\u044e\u0442 \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043d\u0435 \u0432\u0435\u0441\u044c \u043a\u0435\u0448, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nb\/lw\/yn\/nblwynxdkowrcybuupj_lgy0wta.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0442\u0430\u043a\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0437\u0430\u0434\u0430\u0447: <code>compile<\/code> (Java-\u043f\u043b\u0430\u0433\u0438\u043d) -&gt; <code>report<\/code> (\u043d\u0430\u0448\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430). <code>compile<\/code> \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>JavaCompile<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e Java-\u043f\u043b\u0430\u0433\u0438\u043d\u0430. <code>report<\/code> \u2014 \u043d\u0430\u0448\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438: \u0432\u043d\u0443\u0442\u0440\u0438 <code>buildSrc<\/code> \u0438\u043b\u0438 <code>build.gradle<\/code>. <\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0435\u0441\u0451\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 \u0437\u0430\u0434\u0430\u0447\u0438 <code>report<\/code> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435, \u0432\u043b\u0438\u044f\u044e\u0449\u0435\u0435 \u043d\u0430 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 <code>buildSrc<\/code>-\u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0438 <code>compile<\/code> \u0438 <code>report<\/code> \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u0441\u043d\u043e\u0432\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043a\u043b\u0430\u0441\u0441 <code>compile<\/code> \u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0410 \u043f\u0440\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c <code>build.gradle<\/code> \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043b\u0438\u0448\u044c \u0437\u0430\u0434\u0430\u0447\u0430 <code>report<\/code>. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 <code>compile<\/code> \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u0437\u044f\u0442\u044b \u0438\u0437 \u043a\u0435\u0448\u0430. Gradle \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 <code>report<\/code> \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0451 \u0441\u043d\u043e\u0432\u0430, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438. <\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0437\u0430\u0434\u0430\u0447\u0430 <code>compile<\/code> \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e? \u0412\u0435\u0434\u044c \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0438 \u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>buildSrc<\/code> \u0440\u0430\u0434\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"kompozitnye-sborki\">\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c, \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u043e\u0433\u043e\u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u043c <code>build.gradle<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u0435\u0437 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0447\u0430\u0441\u0442\u0435\u0439 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f Gradle-\u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u0412\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u043f\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443 \u0438\u0437 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 (included) \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 <code>buildSrc<\/code> \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0442\u043e \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c <code>buildSrc<\/code> \u0438 Gradle \u043d\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442 \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u041b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u043a\u0430\u043a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Android Gradle plugin). \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Gradle \u043c\u043e\u0436\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043b\u0438\u044f\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/build_cache.html\">\u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438<\/a>. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 classpath. \u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043a\u0435\u0448\u0430, \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u0443 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u0443\u0441 <code>FROM-CACHE<\/code>. \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/more_about_tasks.html#sec:up_to_date_checks\">\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/a>, \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0438 Gradle \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u0442\u0430\u0442\u0443\u0441 <code>UP-TO-DATE<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"migraciya-s-buildsrc-na-kompozitnuyu-sborku\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441 buildSrc \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/github.com\/badoo\/Reaktive\">Reaktive<\/a> \u043d\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443. \u042d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/badoo\/Reaktive\/tree\/59a612fc6139a28335b92536be63d27e4aeb83f8\/buildSrc\">buildSrc<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b;<\/li>\n<li>\u0443 \u043d\u0435\u0451 \u0435\u0441\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/gradle\/binary-compatibility.gradle\">binary-compatibility.gradle<\/a>;<\/li>\n<li>\u0443 \u043d\u0435\u0451 \u043e\u0431\u0449\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/build.gradle\">build.gradle<\/a>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u042f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0438\u0437 \u043d\u0438\u0445 \u0438 \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"kopirovanie\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u043f\u0440\u043e\u0441\u0442. \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u043f\u043a\u0443 <code>buildSrc<\/code> \u0432 \u043f\u0430\u043f\u043a\u0443 <code>buildSrc2<\/code>. \u0415\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0451 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 <code>buildSrc<\/code>, \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/custom_plugins.html\">\u043d\u0430\u0447\u0430\u0442\u044c<\/a>. \u0411\u0435\u0437 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432 classpath \u0441\u043a\u0440\u0438\u043f\u0442\u0430. \u041f\u043e\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0439\u0442\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 <code>buildSrc<\/code>, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c Gradle \u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>settings.gradle<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ projectRoot\/settings.gradle.kts  pluginManagement {     repositories {         google()         jcenter()         gradlePluginPortal()     } }  includeBuild(&quot;buildSrc2&quot;)  \/\/ include(&quot;:module&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0430 <code>buildscript { repositories { } }<\/code>. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>includeBuild<\/code> \u043c\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c Gradle \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0432 \u043f\u0430\u043f\u043a\u0435 <code>buildSrc2<\/code> \u043a\u0430\u043a \u0441 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"migraciya-plaginov\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 <code>buildSrc2<\/code>? \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ projectRoot\/buildSrc2\/build.gradle.kts  plugins {     `kotlin-dsl`     `java-gradle-plugin` }  gradlePlugin {     \/\/ \u041e\u0431\u044a\u044f\u0432\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d, \u0447\u0442\u043e\u0431\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b     plugins.register(&quot;class-loader-plugin&quot;) {         id = &quot;class-loader-plugin&quot;         implementationClass = &quot;com.example.ClassLoaderPlugin&quot;     }     \/\/ \u0418\u043b\u0438, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c }<\/code><\/pre>\n<p>  <\/p>\n<p><code>java-gradle-plugin<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b <code>properties<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e <code>java-gradle-plugin<\/code> \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/java_gradle_plugin.html#sec:gradle_plugin_dev_usage\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>buildSrc<\/code>, \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u0442\u0430\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 Gradle-\u0441\u043a\u0440\u0438\u043f\u0442\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ ClassLoaderPlugin.kt  class ClassLoaderPlugin: Plugin&lt;Project&gt; {     override fun apply(target: Project) {         \/\/ no-op     } }  \/\/ Deps.kt  object Deps {     const val kotlinStdLib = &quot;...&quot; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>class-loader-plugin<\/code> \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043b\u0430\u0441\u0441 <code>Deps<\/code>. \u0418 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0440\u0435\u0436\u0434\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/app\/build.gradle  plugins {     id 'class-loader-plugin' }  dependencies {     implementation(Deps.kotlinStdLib) }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"migraciya-obschih-funkciy\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h3>\n<p>  <\/p>\n<p>\u0412 <code>build.gradle<\/code> \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/build.gradle#L19\">setupMultiplatformLibrary<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/build.gradle  void setupMultiplatformLibrary(Project project) {     project.apply plugin: 'org.jetbrains.kotlin.multiplatform'     project.kotlin {         sourceSets {             commonMain {                 dependencies {                     implementation Deps.kotlin.stdlib.common                 }             }              commonTest {                 dependencies {                     implementation Deps.kotlin.test.common                     implementation Deps.kotlin.test.annotationsCommon                 }             }         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u0443\u044e \u043e\u0431\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439. \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d Kotlin Multiplatform \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 Gradle-\u043f\u043b\u0430\u0433\u0438\u043d \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ projectRoot\/buildSrc2\/build.gradle.kts  dependencies {     \/\/ \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430 Kotlin Gradle plugin, \u0447\u0442\u043e\u0431\u044b \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u044b     implementation(&quot;org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72&quot;) } gradlePlugin {     \/\/ \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043f\u043b\u0430\u0433\u0438\u043d     plugins.register(&quot;mpp-configuration&quot;) {         id = &quot;mpp-configuration&quot;         implementationClass = &quot;com.badoo.reaktive.configuration.MppConfigurationPlugin&quot;     } }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ MppConfigurationPlugin.kt  class MppConfigurationPlugin : Plugin&lt;Project&gt; {     override fun apply(target: Project) {         \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043a\u0430\u043a &quot;kotlin&quot; \u0438\u043b\u0438 &quot;android&quot;         target.extensions.create(&quot;configuration&quot;, MppConfigurationExtension::class.java, target)         \/\/ \u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Kotlin         setupMultiplatformLibrary(target)     }      private fun setupMultiplatformLibrary(target: Project) {         \/\/ project.apply plugin: 'org.jetbrains.kotlin.multiplatform'         target.apply(plugin = &quot;org.jetbrains.kotlin.multiplatform&quot;)         \/\/ project.kotlin {         target.extensions.configure(KotlinMultiplatformExtension::class.java) {             sourceSets {                 maybeCreate(&quot;commonMain&quot;).dependencies { implementation(Deps.kotlin.stdlib.common) }                 maybeCreate(&quot;commonTest&quot;).dependencies {                     implementation(Deps.kotlin.test.common)                     implementation(Deps.kotlin.test.annotationsCommon)                 }             }         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/build.gradle#L52\">setupAllTargetsWithDefaultSourceSets<\/a> \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>isLinuxArm32HfpEnabled<\/code>. \u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 <code>linuxArm32Hfp<\/code>, \u0430 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u0438 \u043a\u0430\u043a \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <code>linuxArm32Hfp<\/code>, \u0442\u0430\u043a \u0438 \u0431\u0435\u0437 \u043d\u0435\u0451. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c <code>project.name<\/code>, \u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u044d\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ MppConfigurationExtension.kt  open class MppConfigurationExtension @Inject constructor(     private val project: Project ) {     var isLinuxArm32HfpEnabled: Boolean = false         private set      \/\/ \u041c\u044b \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 ARM32     fun enableLinuxArm32Hfp() {         if (isLinuxArm32HfpEnabled) return         project.plugins.findPlugin(MppConfigurationPlugin::class.java)?.setupLinuxArm32HfpTarget(project)         isLinuxArm32HfpEnabled = true     } }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ MppConfigurationPlugin.kt  class MppConfigurationPlugin : Plugin&lt;Project&gt; {     override fun apply(target: Project) {         target.extensions.create(&quot;configuration&quot;, MppConfigurationExtension::class.java, target)         ...     }      fun setupLinuxArm32HfpTarget(project: Project) {         if (!Target.shouldDefineTarget(project, Target.LINUX)) return         project.kotlin {             linuxArm32Hfp()             sourceSets {                 maybeCreate(&quot;linuxArm32HfpMain&quot;).dependsOn(getByName(&quot;linuxCommonMain&quot;))                 maybeCreate(&quot;linuxArm32HfpTest&quot;).dependsOn(getByName(&quot;linuxCommonTest&quot;))             }         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 (<code>disableLinuxArm32Hfp()<\/code> \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d Kotlin \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435). \u0417\u0430\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043b\u0430\u0433\u0438\u043d\u0430 <code>mpp-configuration<\/code> \u0438 \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f <code>configuration<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/reaktive\/build.gradle  plugins {     id 'mpp-configuration' }  \/\/ \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e configuration {     enableLinuxArm32Hfp() }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0430\u0434\u043e.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jo\/sj\/up\/josjupvt52-cig6vgz59g9hhxt0.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"migraciya-vneshnego-fayla-skripta\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/h3>\n<p>  <\/p>\n<p>\u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/github.com\/Kotlin\/binary-compatibility-validator\">Binary compatibility validator<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b <a href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/484712\">\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>. \u0415\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/gradle\/binary-compatibility.gradle\">binary-compatibility.gradle<\/a> \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u0435 <code>build.gradle<\/code>. \u041f\u043e \u0441\u0443\u0442\u0438, \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u0437\u0430\u0434\u0430\u0451\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/binary-compatibility.gradle  if (Target.shouldDefineTarget(target, Target.ALL_LINUX_HOSTED)) {     apply plugin: kotlinx.validation.BinaryCompatibilityValidatorPlugin      apiValidation {         ignoredProjects += [                 'benchmarks',                 'jmh',                 'sample-mpp-module',                 'sample-android-app',                 'sample-js-browser-app',                 'sample-linuxx64-app',                 'sample-ios-app',                 'sample-macos-app'         ]     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ projectRoot\/buildSrc2\/build.gradle.kts  dependencies {     \/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430 Binary Compatibility Plugin     implementation(&quot;org.jetbrains.kotlinx:binary-compatibility-validator:0.2.3&quot;) } gradlePlugin {     \/\/ \u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 \u043f\u043b\u0430\u0433\u0438\u043d     plugins.register(&quot;binary-compatibility-configuration&quot;) {         id = &quot;binary-compatibility-configuration&quot;         implementationClass = &quot;com.badoo.reaktive.compatibility.BinaryCompatibilityConfigurationPlugin&quot;     } }<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ BinaryCompatibilityConfigurationPlugin.kt  class BinaryCompatibilityConfigurationPlugin : Plugin&lt;Project&gt; {     override fun apply(target: Project) {         if (Target.shouldDefineTarget(target, Target.ALL_LINUX_HOSTED)) {             target.apply(plugin = &quot;binary-compatibility-validator&quot;)             target.extensions.configure(ApiValidationExtension::class) {                 ignoredProjects.addAll(                     listOf(                         &quot;benchmarks&quot;,                         &quot;jmh&quot;,                         &quot;sample-mpp-module&quot;,                         &quot;sample-android-app&quot;,                         &quot;sample-js-browser-app&quot;,                         &quot;sample-linuxx64-app&quot;,                         &quot;sample-ios-app&quot;,                         &quot;sample-macos-app&quot;                     )                 )             }         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <code>build.gradle<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/\/ projectRoot\/build.gradle  plugins {     id 'binary-compatibility-configuration' }<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"zavisimosti\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h3>\n<p>  <\/p>\n<p>\u0421 \u043d\u0430\u0448\u0438\u043c \u043d\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u0432\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043a\u0430\u0445. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0430\u043c, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0442. \u0434. \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ rootProject\/dependencies\/build.gradle.kts  plugins {     `kotlin-dsl`     `java-gradle-plugin` }  \/\/ \u0417\u0430\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 group = &quot;com.badoo.reaktive.dependencies&quot; version = &quot;SNAPSHOT&quot;  repositories {     jcenter() }  gradlePlugin {     \/\/ \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c     plugins.register(&quot;dependencies&quot;) {         id = &quot;dependencies&quot;         implementationClass = &quot;com.badoo.reaktive.dependencies.DependenciesPlugin&quot;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>Deps<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/badoo\/Reaktive\/blob\/59a612fc6139a28335b92536be63d27e4aeb83f8\/buildSrc\/buildSrc\/src\/main\/kotlin\/Deps.kt\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 <code>settings.gradle<\/code> \u043d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>includeBuild(&quot;dependencies&quot;)<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <code>dependencies<\/code> \u0438 \u043a\u043b\u0430\u0441\u0441 <code>Deps<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"kotlin\">\/\/ projectRoot\/buildSrc2\/build.gradle.kts  import com.badoo.reaktive.dependencies.Deps  plugins {     `kotlin-dsl`     `java-gradle-plugin`     id(&quot;dependencies&quot;) }  dependencies {     \/\/ \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Deps     implementation(Deps.kotlin.plugin)     \/\/ implementation(implementation(&quot;com.badoo.reaktive.dependencies:dependencies:SNAPSHOT&quot;)) }  \/\/ \u041f\u043e\u0447\u0442\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 implementation(&quot;com.badoo.reaktive.dependencies:dependencies:SNAPSHOT&quot;), \u043d\u043e \u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c kotlin.sourceSets.getByName(&quot;main&quot;).kotlin.srcDir(&quot;..\/dependencies\/src\/main\/kotlin&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438, \u0442\u043e IDEA \u043d\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0451 \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 (\u0445\u043e\u0442\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a). \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043a\u043b\u0430\u0441\u0441 <code>Deps<\/code> \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e <code>buildSrc2<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438\u0437 <code>buildSrc2<\/code>. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0431\u044b\u0439 \u0438 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u043d\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u044f\u0442. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e <code>implementation(&quot;com.badoo.reaktive.dependencies:dependencies:SNAPSHOT&quot;)<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d <code>dependencies<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/p>\n<p>  <\/p>\n<h2 id=\"nedostatki\">\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a \u0438 <code>buildSrc<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \u041e\u043d\u0430 \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0431\u043b\u043e\u043a <code>plugins { }<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>apply plugin: 'id'<\/code> \u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0430 <code>plugins<\/code> \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 Groovy-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435. \u0423 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c. \u041d\u043e \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u0433\u0438\u043d\u0430. <\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0442\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">apply plugin: 'android-library'  android {     compileSdkVersion 30 }  apply plugin: 'custom-plugin'<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"kotlin\">class CustomPlugin: Plugin&lt;Project&gt; {     override fun apply(target: Project) {         target.logger.warn(             target.extentions.getByType(BaseExtension::class)                 .compileSdkVersion.toString()         )     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043b\u0430\u0433\u0438\u043d \u043f\u0440\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 <code>compileSdkVersion<\/code>. \u0412 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>30<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a <code>plugins { }<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">plugins {     id 'android-library'     id 'custom-plugin' }  android {     compileSdkVersion 30 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 <code>null<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>custom-plugin<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u0434\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <code>android<\/code>. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>apply plugin: 'custom-plugin'<\/code> \u0438\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e, \u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e-\u0441\u0442\u0430\u0440\u043e\u043c\u0443.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0431\u043b\u043e\u043a <code>project.afterEvaluate { }<\/code>. \u041d\u043e \u0431\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b: \u0435\u0441\u043b\u0438 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u044c \u044d\u0442\u0438\u043c, \u0442\u043e \u0431\u043b\u043e\u043a\u0438 <code>afterEvaluate<\/code> \u043d\u0430\u0447\u043d\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 <code>afterEvaluate<\/code> \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/li>\n<li>\u041f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/lazy_configuration.html\">\u043b\u0435\u043d\u0438\u0432\u043e\u0433\u043e API<\/a>, <a href=\"https:\/\/guides.gradle.org\/writing-gradle-tasks\/\">\u0437\u0430\u0434\u0430\u0447<\/a> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432 Gradle API, \u043d\u043e \u0437\u0430\u0442\u043e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b.<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b <code>buildSrc<\/code>, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043a\u0435\u0448\u0430 Gradle. \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043d\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u0427\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 Groovy-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445, \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 <code>plugins { }<\/code>. \u0410 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0437 \u0442\u043e\u0433\u043e \u0436\u0435 \u043c\u043e\u0434\u0443\u043b\u044f.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/514094\/\"> https:\/\/habr.com\/ru\/company\/badoo\/blog\/514094\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/514094\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rb\/ed\/wg\/rbedwgjw12jetb3d3ajktzwaoss.png\"><\/p>\n<p>  <\/p>\n<p>\u0412 Gradle \u2014 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u2014 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 <a href=\"https:\/\/docs.gradle.org\/current\/userguide\/organizing_gradle_projects.html#sec:build_sources\">buildSrc<\/a> \u0443\u0436\u0435 \u0443\u0441\u043f\u0435\u043b \u0441\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0438 \u0437\u0430\u0434\u0430\u0447, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0432\u0435\u0440\u0441\u0438\u0439. \u041d\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a: \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 <code>buildSrc<\/code> \u043a\u0435\u0448 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c Gradle \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438, \u043b\u0438\u0448\u0451\u043d\u043d\u044b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0432\u043c\u0435\u0441\u0442\u043e <code>buildSrc<\/code> \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-308101","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308101","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=308101"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308101\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=308101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=308101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=308101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}