Jor*_*rdi 6 gradle gradle-plugin gradle-kotlin-dsl kotlin-gradle-plugin buildsrc
如何从 buildSrc 插件应用 Kotlin 插件?
\n我有一个 Kotlin 项目,其 build.gradle.kts 文件包含以下内容:
\nplugins {\n application\n kotlin("jvm")\n kotlin("plugin.serialization")\n}\nRun Code Online (Sandbox Code Playgroud)\n我想在 buildSrc 中创建一个自定义插件:
\nimport org.gradle.api.Plugin\nimport org.gradle.api.Project\nimport org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper\n\nclass MyPlugin: Plugin<Project> {\n override fun apply(project: Project) {\n project.pluginManager.apply("org.gradle.application") //This works\n project.pluginManager.apply("\xc2\xbfkotlin(jvm)?") //<-- Here is my doubt\n project.pluginManager.apply("\xc2\xbfkotlin(plugin.serialization)?") //<-- Here is my doubt\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n并像这样使用它:
\nplugins {\n id("com.example.myplugin")\n}\nRun Code Online (Sandbox Code Playgroud)\n
要从 buildSrc 插件中应用 Gradle 插件,您需要做两件事
\n将插件添加为依赖项buildSrc/build.gradle.kts
必须使用Maven 坐标(而不是插件 ID\xe2\x80\xa0)将插件添加为依赖项。插件的 Maven 坐标可以在 Gradle 插件门户中找到。
\n// buildSrc/build.gradle.kts\n\nplugins {\n `kotlin-dsl`\n}\n\ndependencies {\n // the Maven coordinates of the Kotlin Gradle and Serialization plugins\n implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20")\n implementation("org.jetbrains.kotlin:kotlin-serialization:1.7.20")\n}\nRun Code Online (Sandbox Code Playgroud)\n使用类或插件 ID 应用插件。
\n(请注意,这kotlin("jvm")是一个辅助函数,它掩盖了实际的 Gradle 插件 ID,即org.jetbrains.kotlin.jvm)
class MyPlugin: Plugin<Project> {\n override fun apply(project: Project) {\n\n project.pluginManager.apply("org.jetbrains.kotlin.jvm")\n project.pluginManager.apply("org.jetbrains.kotlin.plugin.serialization")\n\n // the plugin class for the Kotlin JVM & Serialization plugins\n project.plugins.apply(org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper::class)\n project.plugins.apply(org.jetbrains.kotlinx.serialization.gradle.SerializationGradleSubplugin::class)\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n(找到插件类并不容易 - 我必须在 jar 中挖掘才能找到插件标记工件,例如kotlin-serialization-1.7.20-gradle71.jar!/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.serialization.properties)
您可能还想使用预编译的脚本插件。它们允许编写与标准文件更相似的 buildSrc 脚本插件build.gradle.kts,因此您可以在插件块中应用插件。
// buildSrc/src/main/kotlin/conventions/kotlin-jvm.gradle.kts\n\nplugins {\n kotlin("jvm")\n}\nRun Code Online (Sandbox Code Playgroud)\n要启用预编译脚本插件,请确保您kotlin-dsl已在buildSrc/build.gradle.kts.
// buildSrc/build.gradle.kts\n\nplugins {\n `kotlin-dsl`\n}\nRun Code Online (Sandbox Code Playgroud)\n当您应用上述步骤并收到错误时会发生什么情况Plugin request for plugin already on the classpath must not include a version?
有很多方法可以指定 Gradle 插件的版本(我认为太多了!)。如果您要使用上述步骤更新现有项目,那么您只是使用了另一种指定版本的方法,并且 Gradle 会抛出一条无用的错误消息。
\n解决这个问题的方法是限制项目指定 Gradle 插件版本的方式数量。可能发生的情况是您添加了一个插件,并且buildSrc/build.gradle.kts您也在子项目的插件块中应用了该插件。Gradle 会对你想要哪个版本的插件感到困惑。
修复它的方法是仅在一个位置指定插件版本,并且该位置作为buildSrc/build.gradle.kts.
// my-cool-subproject/build.gradle.kts\n\nplugins {\n kotlin("jvm")// version "1.9.0" // version is not necessary, it\'s specified in buildSrc/build.gradle.kts\n}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\xa0 请注意,实际上可以通过一些操作将插件 ID 用作常规依赖项。Gradle 可以通过Plugin Marker Artifact从任何Maven 存储库发现插件。给定插件 ID,Maven GAV 坐标可以确定如下:
\nval kmpPluginId = "org.jetbrains.kotlin.multiplatform"\nval kmpPluginVersion = "1.9.0"\nval kmpMavenGav = "${kmpPluginId}:${kmpPluginId}.gradle.plugin:${kmpPluginVersion}"\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2614 次 |
| 最近记录: |