如何在多个 Gradle 项目之间共享样板 Kotlin 配置?

2024-04-19

The 典型的 Kotlin 配置 https://kotlinlang.org/docs/reference/using-gradle.htmlGradle 项目中的代码非常样板,我正在寻找一种将其抽象为外部构建脚本的方法,以便可以重用它。

我有一个可行的解决方案(如下),但感觉有点像黑客,因为 kotlin-gradle-plugin 不能以这种方式开箱即用。

当您从外部脚本应用任何非标准插件时,这是很混乱的无法通过id应用插件 https://discuss.gradle.org/t/how-do-i-apply-a-plugin-to-a-project-from-a-shared-applied-gradle-file/7508, i.e.

apply plugin: 'kotlin'将导致Plugin with id 'kotlin' not found.

简单(通常)的解决方法是通过插件的完全限定类名来应用,即

apply plugin: org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper

在这种情况下会抛出一个很好的小异常,表明该插件可能不应该这样调用:

Failed to determine source cofiguration of kotlin plugin. 
Can not download core. Please verify that this or any parent project
contains 'kotlin-gradle-plugin' in buildscript's classpath configuration.

所以我设法拼凑了一个插件(只是一个修改版本真正的插件 https://github.com/JetBrains/kotlin/blob/v1.0.3/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt)这迫使它从当前的构建脚本中查找插件。

kotlin.gradle

buildscript {
    ext.kotlin_version = "1.0.3"
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
}

apply plugin: CustomKotlinPlugin
import org.jetbrains.kotlin.gradle.plugin.CleanUpBuildListener
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper
import org.jetbrains.kotlin.gradle.plugin.KotlinPlugin
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider

/**
 * Wrapper around the Kotlin plugin wrapper (this code is largely a refactoring of KotlinBasePluginWrapper).
 * This is required because the default behaviour expects the kotlin plugin to be applied from the project,
 * not from an external buildscript.
 */
class CustomKotlinPlugin extends KotlinBasePluginWrapper {

    @Override
    void apply(Project project) {
        // use String literal as KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY constant isn't available
        System.setProperty("kotlin.environment.keepalive", "true")

        // just use the kotlin version defined in this script
        project.extensions.extraProperties?.set("kotlin.gradle.plugin.version", project.property('kotlin_version'))

        // get the plugin using the current buildscript
        def plugin = getPlugin(this.class.classLoader, project.buildscript)
        plugin.apply(project)

        def cleanUpBuildListener = new CleanUpBuildListener(this.class.classLoader, project)
        cleanUpBuildListener.buildStarted()
        project.gradle.addBuildListener(cleanUpBuildListener)
    }

    @Override
    Plugin<Project> getPlugin(ClassLoader pluginClassLoader, ScriptHandler scriptHandler){
        return new KotlinPlugin(scriptHandler, new KotlinTasksProvider(pluginClassLoader));
    }
}

然后可以将其应用于任何项目(即apply from: "kotlin.gradle")然后您就可以开始进行 Kotlin 开发了。

它有效,而且我还没有遇到任何问题,但我想知道是否有更好的方法?我不太热衷于每次有新版本的 Kotlin 时都合并对插件的更改。


查看星云 kotlin 插件 https://github.com/nebula-plugins/nebula-kotlin-plugin。它似乎非常接近您想要在那里实现的目标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在多个 Gradle 项目之间共享样板 Kotlin 配置? 的相关文章

随机推荐

  • 在 JavaScript 中创建 1..20 整数数组的最简洁方法

    创建此数组的最简洁方法是什么 var x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 例如 一个for loop var x for var i 1 i lt 20 i x push
  • PHP:对象上的递归 htmlspecialchars

    我想为来自不同来源的数据建立一个通用的清理程序 对于清理 我的意思是 在这个阶段 将 htmlspecialchars 应用于字符串 现在 来自这些源的数据可以是任何东西 从对象到数组再到字符串 都是嵌套的 而且很复杂 并且格式总是有点不同
  • java.lang.IllegalArgumentException:无效的 URL:未知协议:f

    我需要编写一个程序来在javafx场景中显示图片 我使用ImageView来显示它 但我遇到了一个问题 线程 main 中的异常 java lang IllegalArgumentException 无效的 URL 未知协议 f 引起原因
  • 如何禁用 onclick 事件

    如何禁用 onclick 事件 我试过了onclick this disabled true 但它不起作用 这是一个 HTML 表格 table tr td Available td td Available td tr tr td div
  • 动画 div 高度一个接一个 onload javascript

    我已经成功地开始了我的动画工作 现在我希望其余的动画在每个动画之后稍微延迟div高度动画及其引起的问题 我尝试过使用getElementsByClassName但这并没有奏效 我已经发布了到目前为止的进展here https codepen
  • 重写 bool 抽象方法时出错

    我不明白为什么我的派生类中会出现此错误来覆盖方法布尔值 public class HotRod Racer private bool blower true false public HotRod public HotRod string
  • Node.js 和 C/C++ 集成:如何正确实现回调?

    我正在尝试实现一个与 Node js 集成的 C 扩展 该扩展将在内部调用一些阻塞调用 因此它需要为 Node js 世界提供一个非阻塞接口 如指定https nodejs org api addons html https nodejs
  • 防止 GNU make 在环境变量中扩展美元符号

    有没有办法让 GNU Make 在环境变量中按字面意思解释美元符号 获取这个 makefile echoFOO echo FOO 像这样运行它 FOO a bc make echo ac ac 我希望它能从字面上回应 a bc 但我找不到一
  • 在客户端 API 中使用 JWT 令牌

    我在 NET5 中有一个 API 使用 JWTBearer 来保护 API 现在我想配置我的客户端应用程序以使用从 api gettoken 生成的令牌 它在 swagger 中工作得很好 但我不知道如何配置我的 MVC 和 API 消费
  • UIScrollView:缩放后内容偏移计算

    有人可以建议在 UIScrollView 放大后使用哪个公式来计算内容偏移吗 让我们考虑以下示例 我有一个 UIScrollView 内容视图的大小为 1000 1000 那么如果我以编程方式setZoomScale到 2 0 并在scro
  • Riak:如果目标被删除,链接会消失吗?

    当从商店中删除商品时 链接到现在丢失的商品的所有文档中的链接是否会自动删除 或者我们是否遇到过类似于 HTML 页面上损坏的链接的情况 不 链接不会自动删除 链接只是与对象一起存储的元数据 因此要查找链接到已删除对象的所有对象 您需要遍历整
  • 检查服务器上文件的差异

    我的机器上有一个存储库的工作副本 并且我知道它已在服务器上更新 我想知道如何通过使用来获取新版本和工作副本中的版本之间的差异svn命令行参数 我有办法做到这一点吗 工作副本是修订版 BASE 存储库中的最新副本是修订版 HEAD 这会将您的
  • 在 C++03 中返回 `std::auto_ptr` 集合之类的内容的最佳方法是什么?

    std auto ptr不允许存储在STL容器中 例如std vector 但是 有时我需要返回多态对象的集合 因此我无法返回对象向量 由于切片问题 我可以用std tr1 shared ptr并将它们粘贴在vector 但随后我必须付出高
  • 重定向后,curl 对所有请求使用 POST

    根据文档和一些类似的问题 SOcurl 应该遵循使用 GET 方法的重定向 除非将 post30x 指定为参数 但这是我测试的结果 curl kvv b tmp tmp BEo6w3GKDq c tmp tmp BEo6w3GKDq X P
  • 增强元组+变换

    是否可以进行以下操作 假设我的 boost 元组有
  • 检测类属性值更改,然后更改另一个类属性

    假设我有一个名为 Number 的类 class Number def init self n self n n self changed None a Number 8 print a n prints 8 a n 9 print a n
  • 用面向对象的方法设置标签元素的属性

    标签有一个 for 属性 使它们指向某个输入字段 我需要使用 JQuery 更改此属性的值 以便我可以使用 label attr for targetName 但我还需要设置 className 所以我更喜欢使用 label attr fo
  • 当给定距起点的距离时,找到贝塞尔曲线上的点?

    我创建了一条 4 点贝塞尔曲线和一个距离 从起点开始 如何找到距起点一定距离的点的 x y 坐标 我查看了其他示例 据我所知 他们通过将曲线划分为几千个点 然后找到最近的点来近似值 这对我不起作用 对于我正在做的事情 我希望精确到小数点后两
  • 使用 Python 移动特定文件类型

    我知道这对你们中的许多人来说会非常容易 我刚刚开始学习 Python 需要一些基本文件处理方面的帮助 我拍摄了很多屏幕截图 最终出现在我的桌面上 因为这是默认设置 我知道我可以更改屏幕截图设置以自动将其保存在其他位置 不过 我认为这个程序将
  • 如何在多个 Gradle 项目之间共享样板 Kotlin 配置?

    The 典型的 Kotlin 配置 https kotlinlang org docs reference using gradle htmlGradle 项目中的代码非常样板 我正在寻找一种将其抽象为外部构建脚本的方法 以便可以重用它 我