当前位置: 首页 > 知识库问答 >
问题:

如何跨多个Gradle项目共享样板静态编程语言配置?

壤驷英叡
2023-03-14

Gradle项目中典型的静态编程语言配置是非常样板的,我正在寻找一种将其抽象成外部构建脚本的方法,以便可以重用。

我有一个可行的解决方案(见下文),但它感觉有点像黑客,因为kotlin gradle插件不是这样开箱即用的。

从外部脚本应用任何非标准插件都很麻烦,因为您无法通过id应用插件,即。

apply plugin:'kotlin'将导致找不到id为'kotlin'的插件

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

应用插件:org。喷气式飞机。科特林。格拉德尔。插件。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.

所以我设法拼凑了一个插件(只是真实插件的一个修改版本),迫使它从当前的构建脚本中找到插件。

科特林。格拉德尔

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));
    }
}

然后,这可以应用于任何项目(即从“kotlin.gradle”应用),您就可以开始运行kotlin开发了。

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

共有2个答案

须巴英
2023-03-14

这里的问题是,有一个已知的gradle错误,即无法通过初始化脚本的id应用插件。这就是为什么您需要使用完全限定类名作为解决方案。

例如,我在初始化脚本中有以下内容,它可以工作:

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

顺便说一句,我创建了一个gradle插件,用于准备自定义gradle发行版,其公共设置在init script-custom-gradle-dist中定义。它非常适合我的项目,例如构建。库项目的gradle如下所示(这是一个完整的文件,所有存储库、应用插件、依赖项等的设置都在init脚本中定义):

dependencies {
    compile 'org.springframework.kafka:spring-kafka'
}
琴俊人
2023-03-14

查看nebula kotlin插件。这似乎非常接近你想要达到的目标。

 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 标题中的问题。这里提出了一个类似的问题,当时唯一的解决办法是将项目发布到本地Maven存储库中。 这个问题在Android Studio 0.5中修复了吗(正如一些人所声称的)?在其发行说明中有一条声明说“支持模块内容根目录之外的源文件夹”。这是否意味着我们最终可以从项目文件夹外部导入库? 我试过文件- 编辑2:查看最新解决方案的接受答案(截至0.8。) 编辑: 我的项目目录结构只有一个模块,如下

  • 正如标题所说,我正在尝试将Java和Kotlin混合在一个项目中。这里有一个很好的例子。混合java kotlin hello world。除了kotlin在src/main/Java/somepackage/SomeClass中找不到我的任何Java类之外,所有的东西都正常工作。Java语言 这是什么原因? 我的身材。gradle看起来像这样 而不是开始尝试在更大的项目上实现这一点。我试图通过创

  • 我试图在Kotlin中创建一些功能测试,以使用Rest-Assured库向Cart Java服务发出请求。 因为我希望测试按程序进行,所以我希望能够存储第一个API请求的结果,并将其传递给下一个单元测试。 即 createCartTest()-- 从来没有真正使用过静态编程语言,所以寻找测试所有APIendpoint的最佳方法的建议。 还是在同一个函数中发出另一个请求并将结果传递给下一步更好? 跨

  • 我有一个使用Kotlin DSL的Gradle 5.3构建脚本,类似于: 在这里, 解析为 。 现在,再往下,我想这样做(从Groovy DSL构建文件移植): 在这里,解析为——不是我想要的(也不推荐使用)! 计算我可以使用静态编程语言的合格,我尝试使用 相反(注意:额外的字符串换行消除了一个额外的类型错误),但是我现在得到了< code > Unresolved reference:@ Pro

  • 我是一个初学静态编程语言的学生,正在学习一个示例回收人员视图。我开始编码,但没有得到我应该得到的结果,即使在检查和重新检查代码之后也是如此。然后我注意到,即使使用非常基本的代码,它仍然没有按照应有的方式运行。我将包含基本代码,当使用时,它应该显示一个通用列表。我只得到列表中的一项。我怀疑代码以外的其他东西正在影响结果;但是我还没有达到知道的水平。 请看活动内容。xml: 注意它有行。 下面是列表(