{"id":87880,"date":"2024-12-12T05:04:01","date_gmt":"2024-12-12T01:34:01","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/gradle-extensions-part-2-now-with-shenanigans-12m6\/"},"modified":"2024-12-12T05:04:01","modified_gmt":"2024-12-12T01:34:01","slug":"gradle-extensions-part-2-now-with-shenanigans-12m6","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/gradle-extensions-part-2-now-with-shenanigans-12m6\/","title":{"rendered":"\u0627\u0644\u062d\u0627\u0642\u0627\u062a Gradle \u0642\u0633\u0645\u062a 2: \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627 \u0634\u06cc\u0637\u0646\u062a\u200c\u0647\u0627"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n              \u0639\u06a9\u0633 \u0627\u0632 Karsten W\u00fcrth \u062f\u0631 Unsplash<\/p>\n<p>\u0628\u0647 \u062c\u0627\u0646\u0634\u06cc\u0646 \u0645\u0639\u0646\u0648\u06cc \u067e\u0644\u0627\u06af\u06cc\u0646\u200c\u0647\u0627 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646\u06cc Gradle \u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f: \u06cc\u06a9 \u067e\u0631\u0627\u06cc\u0645\u0631 \u0628\u0631\u0627\u06cc \u0627\u0641\u0631\u0627\u062f \u0645\u062a\u062d\u06cc\u0631 (\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u067e\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0646\u060c \u0628\u0647 \u06af\u0648\u0646\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0641\u0636\u0627 \u0628\u0627 \u0627\u0633\u0646\u0627\u062f \u0648\u0627\u0642\u0639\u06cc Gradle \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc Google \u0631\u0642\u0627\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f).<\/p>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 \u0637\u0648\u0644\u0627\u0646\u06cc \u0645\u062f\u062a \u0645\u0646 \u0628\u0631\u0627\u06cc \u0646\u0627\u0628\u0648\u062f \u06a9\u0631\u062f\u0646 buildSrc \u0628\u0627 Fire\u060c \u0627\u062e\u06cc\u0631\u0627\u064b \u0641\u0631\u0635\u062a\u06cc \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u0645 \u0686\u06af\u0648\u0646\u0647 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0627\u0646\u0648\u0627\u0639 \u062f\u06cc\u06af\u0631\u060c \u0645\u0627\u0646\u0646\u062f \u0648\u0638\u0627\u06cc\u0641\u060c \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645. \u0645\u0627 \u06a9\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0645\u062e\u0627\u0632\u0646 \u06a9\u0647 \u062a\u062d\u062a \u0645\u0631\u0627\u0642\u0628\u062a \u0645\u0627 \u0647\u0633\u062a\u0646\u062f \u062a\u06a9\u0631\u0627\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>\/\/ buildSrc\/src\/main\/kotlin\/magic\/Magic.kt<br \/>\npackage magic<\/p>\n<p>object Magic {<br \/>\n  fun shouldPracticeTheDarkArts(): Boolean {<br \/>\n    return System.getenv(&#8220;DO_ANCIENT_MAGIC&#8221;)?.toBoolean()<br \/>\n      ?: System.getenv(&#8220;DO_SLIGHTLY_MORE_MODERN_MAGIC&#8221;)?.toBoolean()<br \/>\n      ?: false<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0627\u06cc\u0646 \u06a9\u062f \u062f\u0631 \u0633\u0627\u062e\u062a \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<p>\/\/ build.gradle.kts<br \/>\nimport magic.Magic<\/p>\n<p>tasks.withType&lt;Test&gt;().configureEach {<br \/>\n  if (Magic.shouldPracticeTheDarkArts()) {<br \/>\n    logger.quiet(&#8220;\ud83d\udc7b&#8221;)<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0686\u0646\u062f\u06cc\u0646 \u0686\u06cc\u0632 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u0645:<\/p>\n<p>\u0645\u0646 \u0627\u06cc\u0646 \u06a9\u062f \u0631\u0627 \u062f\u0631 buildSrc \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u0645. \u0645\u0646 \u0646\u0633\u062e\u0647\u200c\u0627\u06cc \u0627\u0632 \u0622\u0646 \u0631\u0627 \u062f\u0631 build-logic \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u06a9\u0647 \u062a\u062d\u062a \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u06af\u0633\u062a\u0631\u062f\u0647 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0634\u0648\u062f (\u0628\u0647\u200c\u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u0645\u062e\u0632\u0646 \u0645\u062e\u062a\u0644\u0641 \u062a\u06a9\u0631\u0627\u0631\u06cc \u0634\u0648\u062f).<br \/>\n\u0645\u0646 \u0648\u0627\u0631\u062f\u0627\u062a \u0631\u0627 \u062f\u0648\u0633\u062a \u0646\u062f\u0627\u0631\u0645 \u0646\u062c\u0633 \u0627\u0633\u062a. (\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0627\u06cc\u062f \u0633\u0627\u062f\u0647\u060c \u0628\u06cc\u0627\u0646\u06cc \u0648 \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f.)<br \/>\n\u0645\u0646 \u0632\u06cc\u0627\u062f \u0637\u0631\u0641\u062f\u0627\u0631 \u062a\u0645\u0627\u0633 \u0646\u06cc\u0633\u062a\u0645 System.getenv() \u062f\u0631 \u0632\u0645\u06cc\u0646\u0647 Gradle \u0645\u0646 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u0645 \u0627\u0632 ProviderFactory.<\/p>\n<p>  \u062f\u0631 \u062d\u0627\u0644 \u062a\u0645\u062f\u06cc\u062f Test \u0648\u0638\u0627\u06cc\u0641<\/p>\n<p>\u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u0646\u0648\u0627\u0639 Gradle\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0647\u0645\u0647 Tasks (\u0648 \u0627\u0644\u0628\u062a\u0647 Project \u0646\u0648\u0639)\u060c \u0647\u0633\u062a\u0646\u062f ExtensionAware. \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u0622\u0646\u0647\u0627 \u06cc\u06a9 ExtensionContainer \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f.<\/p>\n<p>package magic<\/p>\n<p>abstract class TestMagicExtension @Inject constructor(<br \/>\n  private val providers: ProviderFactory<br \/>\n) {<\/p>\n<p>  internal companion object {<br \/>\n    const val NAME = &#8220;magic&#8221;<\/p>\n<p>    fun create(<br \/>\n      testTask: Test,<br \/>\n      providers: ProviderFactory,<br \/>\n    ) {<br \/>\n      testTask.extensions.create(<br \/>\n        NAME,<br \/>\n        TestMagicExtension::class.java,<br \/>\n        providers,<br \/>\n      )<br \/>\n    }<br \/>\n  }<\/p>\n<p>  fun shouldPracticeTheDarkArts(): Boolean {<br \/>\n    return providers<br \/>\n      .environmentVariable(&#8220;DO_ANCIENT_MAGIC&#8221;)<br \/>\n      .orElse(providers.environmentVariable(&#8220;DO_SLIGHTLY_MORE_MODERN_MAGIC&#8221;))<br \/>\n      .map { it.isNotEmpty() }<br \/>\n      .getOrElse(false)<br \/>\n  }<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u062f\u0631 \u0627\u0641\u0632\u0648\u0646\u0647 \u0645\u0627\u060c \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0647 \u0647\u0645\u0647 \u0645\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 Test \u0648\u0638\u0627\u06cc\u0641:<\/p>\n<p>project.tasks.withType&lt;Test&gt;().configureEach { t -&gt;<br \/>\n  TestMagicExtension.create(t, project.providers)<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645:<\/p>\n<p>\/\/ build.gradle.kts<br \/>\nimport magic.TestMagicExtension<\/p>\n<p>tasks.withType&lt;Test&gt;().configureEach {<br \/>\n  \/\/ the &#8220;extensions&#8221; call is on the Test instance,<br \/>\n  \/\/ not the project instance<br \/>\n  val magic = extensions.getByType(TestMagicExtension::class.java)<br \/>\n  if (magic.shouldPracticeTheDarkArts()) {<br \/>\n    logger.quiet(&#8220;\ud83d\udc7b&#8221;)<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>&#8230; \u06a9\u0647 \u0627\u0635\u0644\u0627 \u0628\u0647\u062a\u0631 \u0646\u06cc\u0633\u062a!<\/p>\n<p>  Groovy: \u0645\u06cc\u0627\u0646\u200c\u0622\u0647\u0646\u06af<\/p>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0642\u062f\u0645 \u0628\u0647 \u0639\u0642\u0628 \u0628\u0631\u06af\u0631\u062f\u06cc\u0645 \u0648 \u0628\u0647 \u062e\u0648\u062f \u06cc\u0627\u062f\u0622\u0648\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 &#8220;\u0645\u0627 \u0639\u0627\u0634\u0642 \u06a9\u0627\u062a\u0644\u06cc\u0646 \u0647\u0633\u062a\u06cc\u0645\u060c \u0627\u06cc\u0645\u0646\u06cc \u062a\u0627\u06cc\u067e \u0639\u0627\u0644\u06cc \u0627\u0633\u062a\u060c \u0645\u0646 \u0627\u0647\u0645\u06cc\u062a\u06cc \u0646\u0645\u06cc \u062f\u0647\u0645 \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u062f\u062a\u0631 \u0627\u0633\u062a&#8230;&#8221; \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0627\u0631\u0647\u0627 \u0648 \u0628\u0627\u0631\u0647\u0627 \u062f\u0631 \u062d\u06cc\u0646 \u062a\u06a9\u0627\u0646 \u062f\u0627\u062f\u0646 \u0628\u06af\u0648\u06cc\u06cc\u0645. \u0648\u0636\u0639\u06cc\u062a \u062c\u0646\u06cc\u0646 \u0631\u0648\u06cc \u0632\u0645\u06cc\u0646 \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0627\u062d\u0633\u0627\u0633 \u0628\u0647\u062a\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645. \u0627\u06a9\u0646\u0648\u0646\u060c \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645\u0627\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062e\u062a \u0627\u0645\u0627 \u062f\u0631 Groovy \u0627\u0633\u062a:<\/p>\n<p>\/\/ build.gradle<br \/>\ntasks.withType(Test).configureEach {<br \/>\n  if (magic.shouldPracticeTheDarkArts()) {<br \/>\n    \/\/ I&#8217;m being cheeky by also omitting the<br \/>\n    \/\/ &#8220;redundant&#8221; parentheses<br \/>\n    logger.quiet &#8220;\ud83d\udc7b&#8221;<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>Groovy \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0628\u0647\u062a\u0631 \u0628\u0627\u0634\u062f! \u0644\u0639\u0646\u062a\u06cc!<\/p>\n<p>  \u0631\u0648\u06cc \u0645\u0642\u062f\u0627\u0631\u06cc \u06af\u0644\u0627\u0628 \u0628\u067e\u0627\u0634\u06cc\u062f<\/p>\n<p>\u0686\u06af\u0648\u0646\u0647 Gradle Kotlin DSL \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f\u061f \u0686\u0631\u0627 \u00ab\u062f\u0633\u062a\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc typesafe\u00bb \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0645\u0646 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u061f \u062e\u0628\u060c \u0633\u0648\u0627\u0644 \u062f\u0648\u0645 \u0633\u0648\u0627\u0644 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a \u0648 \u0645\u0646 \u062c\u0648\u0627\u0628\u06cc \u0646\u062f\u0627\u0631\u0645. \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0646&#8230; \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0641\u0642\u0637 &#8220;\u062a\u0648\u0644\u06cc\u062f&#8221; (\u06cc\u0639\u0646\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645) \u0644\u0648\u0627\u0632\u0645 \u062c\u0627\u0646\u0628\u06cc typeafe \u062e\u0648\u062f\u0645\u0627\u0646 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u0645!<\/p>\n<p>\u0645\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u06a9\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u062c\u062f\u06cc\u062f (\u0628\u0647 \u0645\u0627) \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<p>package org.gradle.kotlin.dsl<\/p>\n<p>import magic.TestMagicExtension<\/p>\n<p>public val Test.magic: TestMagicExtension<br \/>\n  get() = extensions.getByType(TestMagicExtension::class.java)<\/p>\n<p>public fun Test.magic(configure: TestMagicExtension.() -&gt; Unit) {<br \/>\n  configure(TestMagicExtension.NAME, configure)<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0648 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645 Kotlin DSL \u0633\u0627\u062e\u062a \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a:<\/p>\n<p>\/\/ build.gradle.kts<br \/>\ntasks.withType&lt;Test&gt;().configureEach {<br \/>\n  if (magic.shouldPracticeTheDarkArts()) {<br \/>\n    logger.quiet(&#8220;\ud83d\udc7b&#8221;)<br \/>\n  }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0648\u0627\u0642\u0639\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 Gradle \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u062f org.gradle.kotlin.dsl \u0628\u0633\u062a\u0647 \u0628\u0647 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0647\u0645\u0647 \u0622\u0646 \u062a\u0648\u0627\u0628\u0639 \u0641\u0642\u0637 \u0622\u0646\u062c\u0627 \u0647\u0633\u062a\u0646\u062f (\u062f\u0631 \u06cc\u06a9 \u0641\u0636\u0627\u06cc \u0646\u0627\u0645 \u062c\u0647\u0627\u0646\u06cc\u060c \u067e\u0633 \u0645\u0631\u0627\u0642\u0628 \u0628\u0627\u0634\u06cc\u062f!).<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062e\u0648\u062f Gradle \u0627\u0632 \u0622\u0646 \u062f\u0631 \u0627\u0641\u0632\u0648\u0646\u0647 test-retry-gradle-\u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0632 (\u0627\u0632 \u0633\u0627\u0644 2018) \u062f\u0631 \u0631\u062f\u06cc\u0627\u0628 \u0645\u0634\u06a9\u0644 Gradle \u0628\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0632\u0647 \u062f\u0627\u062f\u0646 \u0628\u0647 \u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0648\u0627\u0631\u062f\u0627\u062a \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0631\u0648 \u0648 \u0634\u0627\u062f \u0628\u0627\u0634\u060c \u0632\u06cc\u0631\u0627 \u0622\u0646 \u0632\u0645\u0627\u0646 \u0627\u0632 \u0633\u0627\u0644 \u0627\u0633\u062a.<\/p>\n<div data-article-id=\"2152102\" id=\"article-body\">\n<p><em><small>\u0639\u06a9\u0633 \u0627\u0632 Karsten W\u00fcrth \u062f\u0631 Unsplash<\/small><\/em><\/p>\n<p>\u0628\u0647 \u062c\u0627\u0646\u0634\u06cc\u0646 \u0645\u0639\u0646\u0648\u06cc \u067e\u0644\u0627\u06af\u06cc\u0646\u200c\u0647\u0627 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646\u06cc Gradle \u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f: \u06cc\u06a9 \u067e\u0631\u0627\u06cc\u0645\u0631 \u0628\u0631\u0627\u06cc \u0627\u0641\u0631\u0627\u062f \u0645\u062a\u062d\u06cc\u0631 (\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u067e\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0646\u060c \u0628\u0647 \u06af\u0648\u0646\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0641\u0636\u0627 \u0628\u0627 \u0627\u0633\u0646\u0627\u062f \u0648\u0627\u0642\u0639\u06cc Gradle \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc Google \u0631\u0642\u0627\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f).<\/p>\n<p><\/p>\n<p>\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 \u0637\u0648\u0644\u0627\u0646\u06cc \u0645\u062f\u062a \u0645\u0646 \u0628\u0631\u0627\u06cc \u0646\u0627\u0628\u0648\u062f \u06a9\u0631\u062f\u0646 <code>buildSrc<\/code> \u0628\u0627 Fire\u060c \u0627\u062e\u06cc\u0631\u0627\u064b \u0641\u0631\u0635\u062a\u06cc \u062f\u0627\u0634\u062a\u0645 \u06a9\u0647 \u06cc\u0627\u062f \u0628\u06af\u06cc\u0631\u0645 \u0686\u06af\u0648\u0646\u0647 \u0627\u0641\u0632\u0648\u0646\u0647\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0627\u0646\u0648\u0627\u0639 \u062f\u06cc\u06af\u0631\u060c \u0645\u0627\u0646\u0646\u062f \u0648\u0638\u0627\u06cc\u0641\u060c \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645. \u0645\u0627 \u06a9\u062f\u0647\u0627\u06cc\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0645\u062e\u0627\u0632\u0646 \u06a9\u0647 \u062a\u062d\u062a \u0645\u0631\u0627\u0642\u0628\u062a \u0645\u0627 \u0647\u0633\u062a\u0646\u062f \u062a\u06a9\u0631\u0627\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"c1\">\/\/ buildSrc\/src\/main\/kotlin\/magic\/Magic.kt<\/span>\n<span class=\"k\">package<\/span> <span class=\"nn\">magic<\/span>\n\n<span class=\"kd\">object<\/span> <span class=\"nc\">Magic<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">fun<\/span> <span class=\"nf\">shouldPracticeTheDarkArts<\/span><span class=\"p\">():<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"nc\">System<\/span><span class=\"p\">.<\/span><span class=\"nf\">getenv<\/span><span class=\"p\">(<\/span><span class=\"s\">\"DO_ANCIENT_MAGIC\"<\/span><span class=\"p\">)<\/span><span class=\"o\">?.<\/span><span class=\"nf\">toBoolean<\/span><span class=\"p\">()<\/span>\n      <span class=\"o\">?:<\/span> <span class=\"nc\">System<\/span><span class=\"p\">.<\/span><span class=\"nf\">getenv<\/span><span class=\"p\">(<\/span><span class=\"s\">\"DO_SLIGHTLY_MORE_MODERN_MAGIC\"<\/span><span class=\"p\">)<\/span><span class=\"o\">?.<\/span><span class=\"nf\">toBoolean<\/span><span class=\"p\">()<\/span>\n      <span class=\"o\">?:<\/span> <span class=\"k\">false<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u06cc\u0646 \u06a9\u062f \u062f\u0631 \u0633\u0627\u062e\u062a \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"c1\">\/\/ build.gradle.kts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">magic.Magic<\/span>\n\n<span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">withType<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">Test<\/span><span class=\"p\">&gt;().<\/span><span class=\"nf\">configureEach<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nc\">Magic<\/span><span class=\"p\">.<\/span><span class=\"nf\">shouldPracticeTheDarkArts<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">quiet<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\ud83d\udc7b\"<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0686\u0646\u062f\u06cc\u0646 \u0686\u06cc\u0632 \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0645\u0646 \u0645\u06cc \u062e\u0648\u0627\u0647\u0645 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647\u0628\u0648\u062f \u0628\u062e\u0634\u0645:<\/p>\n<ol>\n<li>\u0645\u0646 \u0627\u06cc\u0646 \u06a9\u062f \u0631\u0627 \u062f\u0631 buildSrc \u0646\u0645\u06cc \u062e\u0648\u0627\u0647\u0645. \u0645\u0646 \u0646\u0633\u062e\u0647\u200c\u0627\u06cc \u0627\u0632 \u0622\u0646 \u0631\u0627 \u062f\u0631 build-logic \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0645 \u06a9\u0647 \u062a\u062d\u062a \u0622\u0632\u0645\u0627\u06cc\u0634 \u0628\u0627\u0634\u062f \u0648 \u0628\u0647 \u0637\u0648\u0631 \u06af\u0633\u062a\u0631\u062f\u0647 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0647 \u0634\u0648\u062f (\u0628\u0647\u200c\u062c\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631 \u0686\u0646\u062f\u06cc\u0646 \u0645\u062e\u0632\u0646 \u0645\u062e\u062a\u0644\u0641 \u062a\u06a9\u0631\u0627\u0631\u06cc \u0634\u0648\u062f).<\/li>\n<li>\u0645\u0646 \u0648\u0627\u0631\u062f\u0627\u062a \u0631\u0627 \u062f\u0648\u0633\u062a \u0646\u062f\u0627\u0631\u0645 \u0646\u062c\u0633 \u0627\u0633\u062a. (\u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0627\u06cc\u062f \u0633\u0627\u062f\u0647\u060c \u0628\u06cc\u0627\u0646\u06cc \u0648 \u0628\u0631\u0627\u06cc \u062a\u062c\u0632\u06cc\u0647 \u0627\u0628\u0632\u0627\u0631\u0647\u0627 \u0622\u0633\u0627\u0646 \u0628\u0627\u0634\u062f.)<\/li>\n<li>\u0645\u0646 \u0632\u06cc\u0627\u062f \u0637\u0631\u0641\u062f\u0627\u0631 \u062a\u0645\u0627\u0633 \u0646\u06cc\u0633\u062a\u0645 <code>System.getenv()<\/code> \u062f\u0631 \u0632\u0645\u06cc\u0646\u0647 Gradle \u0645\u0646 \u062a\u0631\u062c\u06cc\u062d \u0645\u06cc \u062f\u0647\u0645 \u0627\u0632 <code>ProviderFactory<\/code>.<\/li>\n<\/ol>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/gradle-extensions-part-2-now-with-shenanigans-12m6\/#%D8%AF%D8%B1_%D8%AD%D8%A7%D9%84_%D8%AA%D9%85%D8%AF%DB%8C%D8%AF_Test_%D9%88%D8%B8%D8%A7%DB%8C%D9%81\" >\u062f\u0631 \u062d\u0627\u0644 \u062a\u0645\u062f\u06cc\u062f Test \u0648\u0638\u0627\u06cc\u0641<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/gradle-extensions-part-2-now-with-shenanigans-12m6\/#Groovy_%D9%85%DB%8C%D8%A7%D9%86%E2%80%8C%D8%A2%D9%87%D9%86%DA%AF\" >Groovy: \u0645\u06cc\u0627\u0646\u200c\u0622\u0647\u0646\u06af<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/gradle-extensions-part-2-now-with-shenanigans-12m6\/#%D8%B1%D9%88%DB%8C_%D9%85%D9%82%D8%AF%D8%A7%D8%B1%DB%8C_%DA%AF%D9%84%D8%A7%D8%A8_%D8%A8%D9%BE%D8%A7%D8%B4%DB%8C%D8%AF\" >\u0631\u0648\u06cc \u0645\u0642\u062f\u0627\u0631\u06cc \u06af\u0644\u0627\u0628 \u0628\u067e\u0627\u0634\u06cc\u062f<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D8%AF%D8%B1_%D8%AD%D8%A7%D9%84_%D8%AA%D9%85%D8%AF%DB%8C%D8%AF_Test_%D9%88%D8%B8%D8%A7%DB%8C%D9%81\"><\/span>\n<p>  \u062f\u0631 \u062d\u0627\u0644 \u062a\u0645\u062f\u06cc\u062f <code>Test<\/code> \u0648\u0638\u0627\u06cc\u0641<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0627\u0646\u0648\u0627\u0639 Gradle\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0647\u0645\u0647 <code>Task<\/code>s (\u0648 \u0627\u0644\u0628\u062a\u0647 <code>Project<\/code> \u0646\u0648\u0639)\u060c \u0647\u0633\u062a\u0646\u062f <code>ExtensionAware<\/code>. \u0627\u06cc\u0646 \u0628\u062f\u0627\u0646 \u0645\u0639\u0646\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u0622\u0646\u0647\u0627 \u06cc\u06a9 <code>ExtensionContainer<\/code> \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0628\u0631 \u0631\u0648\u06cc \u0622\u0646 \u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0627\u06cc\u062c\u0627\u062f \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">magic<\/span>\n\n<span class=\"k\">abstract<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">TestMagicExtension<\/span> <span class=\"nd\">@Inject<\/span> <span class=\"k\">constructor<\/span><span class=\"p\">(<\/span>\n  <span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">providers<\/span><span class=\"p\">:<\/span> <span class=\"nc\">ProviderFactory<\/span>\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n\n  <span class=\"k\">internal<\/span> <span class=\"k\">companion<\/span> <span class=\"k\">object<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">const<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">NAME<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"magic\"<\/span>\n\n    <span class=\"k\">fun<\/span> <span class=\"nf\">create<\/span><span class=\"p\">(<\/span>\n      <span class=\"n\">testTask<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Test<\/span><span class=\"p\">,<\/span>\n      <span class=\"n\">providers<\/span><span class=\"p\">:<\/span> <span class=\"nc\">ProviderFactory<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n      <span class=\"n\">testTask<\/span><span class=\"p\">.<\/span><span class=\"n\">extensions<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span>\n        <span class=\"nc\">NAME<\/span><span class=\"p\">,<\/span> \n        <span class=\"nc\">TestMagicExtension<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">.<\/span><span class=\"n\">java<\/span><span class=\"p\">,<\/span> \n        <span class=\"n\">providers<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n  <span class=\"p\">}<\/span>\n\n  <span class=\"k\">fun<\/span> <span class=\"nf\">shouldPracticeTheDarkArts<\/span><span class=\"p\">():<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">providers<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">environmentVariable<\/span><span class=\"p\">(<\/span><span class=\"s\">\"DO_ANCIENT_MAGIC\"<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">orElse<\/span><span class=\"p\">(<\/span><span class=\"n\">providers<\/span><span class=\"p\">.<\/span><span class=\"nf\">environmentVariable<\/span><span class=\"p\">(<\/span><span class=\"s\">\"DO_SLIGHTLY_MORE_MODERN_MAGIC\"<\/span><span class=\"p\">))<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">map<\/span> <span class=\"p\">{<\/span> <span class=\"n\">it<\/span><span class=\"p\">.<\/span><span class=\"nf\">isNotEmpty<\/span><span class=\"p\">()<\/span> <span class=\"p\">}<\/span>\n      <span class=\"p\">.<\/span><span class=\"nf\">getOrElse<\/span><span class=\"p\">(<\/span><span class=\"k\">false<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u062f\u0631 \u0627\u0641\u0632\u0648\u0646\u0647 \u0645\u0627\u060c \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0647 \u0647\u0645\u0647 \u0645\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 <code>Test<\/code> \u0648\u0638\u0627\u06cc\u0641:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"n\">project<\/span><span class=\"p\">.<\/span><span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">withType<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">Test<\/span><span class=\"p\">&gt;().<\/span><span class=\"nf\">configureEach<\/span> <span class=\"p\">{<\/span> <span class=\"n\">t<\/span> <span class=\"p\">-&gt;<\/span>\n  <span class=\"nc\">TestMagicExtension<\/span><span class=\"p\">.<\/span><span class=\"nf\">create<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span><span class=\"p\">,<\/span> <span class=\"n\">project<\/span><span class=\"p\">.<\/span><span class=\"n\">providers<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"c1\">\/\/ build.gradle.kts<\/span>\n<span class=\"k\">import<\/span> <span class=\"nn\">magic.TestMagicExtension<\/span>\n\n<span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">withType<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">Test<\/span><span class=\"p\">&gt;().<\/span><span class=\"nf\">configureEach<\/span> <span class=\"p\">{<\/span>\n  <span class=\"c1\">\/\/ the \"extensions\" call is on the Test instance,<\/span>\n  <span class=\"c1\">\/\/ not the project instance<\/span>\n  <span class=\"kd\">val<\/span> <span class=\"py\">magic<\/span> <span class=\"p\">=<\/span> <span class=\"n\">extensions<\/span><span class=\"p\">.<\/span><span class=\"nf\">getByType<\/span><span class=\"p\">(<\/span><span class=\"nc\">TestMagicExtension<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">.<\/span><span class=\"n\">java<\/span><span class=\"p\">)<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">magic<\/span><span class=\"p\">.<\/span><span class=\"nf\">shouldPracticeTheDarkArts<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">quiet<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\ud83d\udc7b\"<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>&#8230; \u06a9\u0647 \u0627\u0635\u0644\u0627 \u0628\u0647\u062a\u0631 \u0646\u06cc\u0633\u062a!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Groovy_%D9%85%DB%8C%D8%A7%D9%86%E2%80%8C%D8%A2%D9%87%D9%86%DA%AF\"><\/span>\n<p>  Groovy: \u0645\u06cc\u0627\u0646\u200c\u0622\u0647\u0646\u06af<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u0648\u0644 \u0627\u0632 \u0647\u0645\u0647\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u06cc\u06a9 \u0642\u062f\u0645 \u0628\u0647 \u0639\u0642\u0628 \u0628\u0631\u06af\u0631\u062f\u06cc\u0645 \u0648 \u0628\u0647 \u062e\u0648\u062f \u06cc\u0627\u062f\u0622\u0648\u0631\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 &#8220;\u0645\u0627 \u0639\u0627\u0634\u0642 \u06a9\u0627\u062a\u0644\u06cc\u0646 \u0647\u0633\u062a\u06cc\u0645\u060c \u0627\u06cc\u0645\u0646\u06cc \u062a\u0627\u06cc\u067e \u0639\u0627\u0644\u06cc \u0627\u0633\u062a\u060c \u0645\u0646 \u0627\u0647\u0645\u06cc\u062a\u06cc \u0646\u0645\u06cc \u062f\u0647\u0645 \u06a9\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0628\u062f\u062a\u0631 \u0627\u0633\u062a&#8230;&#8221; \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0627\u0631\u0647\u0627 \u0648 \u0628\u0627\u0631\u0647\u0627 \u062f\u0631 \u062d\u06cc\u0646 \u062a\u06a9\u0627\u0646 \u062f\u0627\u062f\u0646 \u0628\u06af\u0648\u06cc\u06cc\u0645. \u0648\u0636\u0639\u06cc\u062a \u062c\u0646\u06cc\u0646 \u0631\u0648\u06cc \u0632\u0645\u06cc\u0646 \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0627\u062d\u0633\u0627\u0633 \u0628\u0647\u062a\u0631\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645. \u0627\u06a9\u0646\u0648\u0646\u060c \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645\u0627\u0646 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062e\u062a \u0627\u0645\u0627 \u062f\u0631 Groovy \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight groovy\"><code><span class=\"c1\">\/\/ build.gradle<\/span>\n<span class=\"n\">tasks<\/span><span class=\"o\">.<\/span><span class=\"na\">withType<\/span><span class=\"o\">(<\/span><span class=\"n\">Test<\/span><span class=\"o\">).<\/span><span class=\"na\">configureEach<\/span> <span class=\"o\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">magic<\/span><span class=\"o\">.<\/span><span class=\"na\">shouldPracticeTheDarkArts<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\n    <span class=\"c1\">\/\/ I'm being cheeky by also omitting the <\/span>\n    <span class=\"c1\">\/\/ \"redundant\" parentheses<\/span>\n    <span class=\"n\">logger<\/span><span class=\"o\">.<\/span><span class=\"na\">quiet<\/span> <span class=\"s2\">\"\ud83d\udc7b\"<\/span>\n  <span class=\"o\">}<\/span>\n<span class=\"o\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Groovy \u0642\u0631\u0627\u0631 \u0646\u06cc\u0633\u062a \u0628\u0647\u062a\u0631 \u0628\u0627\u0634\u062f! \u0644\u0639\u0646\u062a\u06cc!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B1%D9%88%DB%8C_%D9%85%D9%82%D8%AF%D8%A7%D8%B1%DB%8C_%DA%AF%D9%84%D8%A7%D8%A8_%D8%A8%D9%BE%D8%A7%D8%B4%DB%8C%D8%AF\"><\/span>\n<p>  \u0631\u0648\u06cc \u0645\u0642\u062f\u0627\u0631\u06cc \u06af\u0644\u0627\u0628 \u0628\u067e\u0627\u0634\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0686\u06af\u0648\u0646\u0647 Gradle Kotlin DSL \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u062f\u061f \u0686\u0631\u0627 \u00ab\u062f\u0633\u062a\u0631\u0633\u06cc\u200c\u0647\u0627\u06cc typesafe\u00bb \u0631\u0627 \u0628\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0641\u0632\u0648\u062f\u0646\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0645\u0646 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u06cc\u200c\u06a9\u0646\u062f\u061f \u062e\u0628\u060c \u0633\u0648\u0627\u0644 \u062f\u0648\u0645 \u0633\u0648\u0627\u0644 \u062e\u0648\u0628\u06cc \u0627\u0633\u062a \u0648 \u0645\u0646 \u062c\u0648\u0627\u0628\u06cc \u0646\u062f\u0627\u0631\u0645. \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0627\u0648\u0644\u06cc\u0646&#8230; \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0641\u0642\u0637 &#8220;\u062a\u0648\u0644\u06cc\u062f&#8221; (\u06cc\u0639\u0646\u06cc \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645) \u0644\u0648\u0627\u0632\u0645 \u062c\u0627\u0646\u0628\u06cc typeafe \u062e\u0648\u062f\u0645\u0627\u0646 \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u0645!<\/p>\n<p>\u0645\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u06a9\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u0633\u062a\u0647 \u062c\u062f\u06cc\u062f (\u0628\u0647 \u0645\u0627) \u0627\u0636\u0627\u0641\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"k\">package<\/span> <span class=\"nn\">org.gradle.kotlin.dsl<\/span>\n\n<span class=\"k\">import<\/span> <span class=\"nn\">magic.TestMagicExtension<\/span>\n\n<span class=\"k\">public<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">Test<\/span><span class=\"p\">.<\/span><span class=\"n\">magic<\/span><span class=\"p\">:<\/span> <span class=\"nc\">TestMagicExtension<\/span>\n  <span class=\"k\">get<\/span><span class=\"p\">()<\/span> <span class=\"p\">=<\/span> <span class=\"n\">extensions<\/span><span class=\"p\">.<\/span><span class=\"nf\">getByType<\/span><span class=\"p\">(<\/span><span class=\"nc\">TestMagicExtension<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">.<\/span><span class=\"n\">java<\/span><span class=\"p\">)<\/span>\n\n<span class=\"k\">public<\/span> <span class=\"k\">fun<\/span> <span class=\"nc\">Test<\/span><span class=\"p\">.<\/span><span class=\"nf\">magic<\/span><span class=\"p\">(<\/span><span class=\"n\">configure<\/span><span class=\"p\">:<\/span> <span class=\"nc\">TestMagicExtension<\/span><span class=\"p\">.()<\/span> <span class=\"p\">-&gt;<\/span> <span class=\"nc\">Unit<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nf\">configure<\/span><span class=\"p\">(<\/span><span class=\"nc\">TestMagicExtension<\/span><span class=\"p\">.<\/span><span class=\"nc\">NAME<\/span><span class=\"p\">,<\/span> <span class=\"n\">configure<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u06a9\u0646\u06cc\u0645 <em>Kotlin DSL<\/em> \u0633\u0627\u062e\u062a \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight kotlin\"><code><span class=\"c1\">\/\/ build.gradle.kts<\/span>\n<span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">withType<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">Test<\/span><span class=\"p\">&gt;().<\/span><span class=\"nf\">configureEach<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">magic<\/span><span class=\"p\">.<\/span><span class=\"nf\">shouldPracticeTheDarkArts<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">quiet<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\ud83d\udc7b\"<\/span><span class=\"p\">)<\/span>\n  <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0645\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0648\u0627\u0642\u0639\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 Gradle \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0648\u0627\u0631\u062f \u0645\u06cc \u06a9\u0646\u062f <code>org.gradle.kotlin.dsl<\/code> \u0628\u0633\u062a\u0647 \u0628\u0647 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0633\u0627\u062e\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0647\u0645\u0647 \u0622\u0646 \u062a\u0648\u0627\u0628\u0639 \u0641\u0642\u0637 \u0622\u0646\u062c\u0627 \u0647\u0633\u062a\u0646\u062f (\u062f\u0631 \u06cc\u06a9 \u0641\u0636\u0627\u06cc \u0646\u0627\u0645 \u062c\u0647\u0627\u0646\u06cc\u060c \u067e\u0633 \u0645\u0631\u0627\u0642\u0628 \u0628\u0627\u0634\u06cc\u062f!).<\/p>\n<p>\u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0644\u06af\u0648\u06cc \u0645\u0639\u0645\u0648\u0644\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062e\u0648\u062f Gradle \u0627\u0632 \u0622\u0646 \u062f\u0631 \u0627\u0641\u0632\u0648\u0646\u0647 test-retry-gradle-\u062e\u0648\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 \u0645\u0634\u06a9\u0644 \u0628\u0627\u0632 (\u0627\u0632 \u0633\u0627\u0644 2018) \u062f\u0631 \u0631\u062f\u06cc\u0627\u0628 \u0645\u0634\u06a9\u0644 Gradle \u0628\u0627 \u06cc\u06a9 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u0627\u062c\u0627\u0632\u0647 \u062f\u0627\u062f\u0646 \u0628\u0647 \u0627\u0641\u0632\u0648\u0646\u0647 \u0647\u0627\u06cc \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0648\u0627\u0631\u062f\u0627\u062a \u067e\u06cc\u0634 \u0641\u0631\u0636 \u062e\u0648\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0628\u0631\u0648 \u0648 \u0634\u0627\u062f \u0628\u0627\u0634\u060c \u0632\u06cc\u0631\u0627 \u0622\u0646 \u0632\u0645\u0627\u0646 \u0627\u0632 \u0633\u0627\u0644 \u0627\u0633\u062a.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0639\u06a9\u0633 \u0627\u0632 Karsten W\u00fcrth \u062f\u0631 Unsplash \u0628\u0647 \u062c\u0627\u0646\u0634\u06cc\u0646 \u0645\u0639\u0646\u0648\u06cc \u067e\u0644\u0627\u06af\u06cc\u0646\u200c\u0647\u0627 \u0648 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0627\u0641\u0632\u0648\u062f\u0646\u06cc Gradle \u062e\u0648\u0634 \u0622\u0645\u062f\u06cc\u062f: \u06cc\u06a9 \u067e\u0631\u0627\u06cc\u0645\u0631 \u0628\u0631\u0627\u06cc \u0627\u0641\u0631\u0627\u062f \u0645\u062a\u062d\u06cc\u0631 (\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u067e\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0646\u060c \u0628\u0647 \u06af\u0648\u0646\u0647\u200c\u0627\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0641\u0636\u0627 \u0628\u0627 \u0627\u0633\u0646\u0627\u062f \u0648\u0627\u0642\u0639\u06cc Gradle \u062f\u0631 \u0628\u0627\u0644\u0627\u06cc \u062c\u0633\u062a\u062c\u0648\u06cc Google \u0631\u0642\u0627\u0628\u062a \u0645\u06cc\u200c\u06a9\u0646\u062f). \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":87881,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-87880","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/87880","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=87880"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/87880\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/87881"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=87880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=87880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=87880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}