如何使用 Gradle 设置多项目 Grails?

Posted

技术标签:

【中文标题】如何使用 Gradle 设置多项目 Grails?【英文标题】:How to set up a multiproject Grails using Gradle? 【发布时间】:2011-09-30 09:50:14 【问题描述】:

我正在尝试为多项目 grails 应用程序设置 gradle 构建脚本。 我使用了grails-gradle plugin 并启动并运行它来创建一个新的应用程序。

但是,当我想将现有的 grails 多项目应用程序转换为使用 gradle 时,我遇到了一些问题。

我已经在我的 settings.gradle 文件中声明了所有子项目如下:

包括“核心”, //插件 '插件1', '插件2'

并为每个子项目在自己的 build.gradle 文件中设置其依赖项。例如 plugin1 依赖于 plugin2,所以我在 plugin1 的 build.gradle 文件中声明了以下内容:

依赖 编译项目(':plugin2')

但是,当我尝试运行 gradle test 命令时出现以下错误:

未解决的依赖关系

出了什么问题: 任务 ':plugin1:test' 执行失败。 原因:无法解析配置 ':plugin1:runtime' 的所有依赖项: - 未解决的依赖关系:#plugin2;1.5-SNAPSHOT:在 #plugin2;1.5-SNAPSHOT:'default' 中找不到配置。 #plugin1;1.5-SNAPSHOT 编译需要它

我的问题是,如何在 gradle 中设置子项目依赖项?

我已经在每个子项目 BuildConfig.groovy 中将它们声明为内联依赖项,我是否也必须在 gradle 中声明它们?

【问题讨论】:

“grails”插件通过主构建文件中的subprojects 闭包添加到子项目中。 Stacktrace 可以在这里查看:Stacktrace 【参考方案1】:

如果其他人有同样的问题,我会回答我自己的问题。

我想为多项目 grails 应用程序(依赖于位于不同文件夹中的多个 grails 插件的主应用程序)设置构建顺序。

我最终在每个子项目构建文件中声明了一个dependsOn()

示例: 我的主要应用程序依赖于 pluginA 和 pluginB。 PluginB 依赖于 PluginC

在我的根 build.gradle 我声明:

dependsOnChildren()

在我的根 settings.gradle 我声明:

include "pluginA","pluginB","pluginC"

在我声明的 pluginB:s build.gradle 文件中

dependsOn(":pluginC")

这解决了我的问题。但是它也引入了另一个问题,即每个插件的测试都已编译但未执行。

我找到了这个@GRAILS-7296的解决方案

我在scripts 文件夹中为每个子项目创建了一个_Events.groovy 文件并包含:

// Override to workaround GRAILS-7296
org.codehaus.groovy.grails.test.support.GrailsTestTypeSupport.metaClass.getSourceDir =  ->
    new File(delegate.buildBinding.grailsSettings.testSourceDir, delegate.relativeSourcePath)

这解决了我所有的问题,我现在有一个使用 Gradle 进行构建的多项目 grails 应用程序。

【讨论】:

【参考方案2】:

原来grails-gradle-plugin并没有应用groovyjava插件,只是添加了java插件正常添加的一些配置,即compileruntime和@987654327 @。所以没有通常用于跨项目依赖的default配置,也没有存储项目产生的工件的archive配置。

所以目前这个插件似乎不支持这样的配置。另请注意,build.gradle 通常也不处理 Grails 插件依赖项。我认为我们可以尝试修复它,但我意识到我并不完全了解您的用例。

我相信你现在想要完成的事情就相当于写了

grails.plugin.location.'plugin-tws-communication' = "../plugin-tws-communication"

BuildConfig.groovy 中用于主项目,但从 Grails 的角度来看,插件之间的关系是什么?是吗:

安装依赖(如插件定义中的dependsOn 映射) 构建顺序依赖(所以一个插件必须在另一个之前构建?然后我们可以通过任务dependsOn来完成它) 编译依赖(所以一个插件需要另一个插件的类来编译)

【讨论】:

感谢您的回复。所有子项目通过主构建文件中的subproject 闭包都具有grails 插件。堆栈跟踪可以在这里找到:stacktrace @Mathias 我已经重写了我的答案,以包括您的答案中的输入 为了澄清我的用例,我想说这主要是我在插件之间的最后一个关系(编译依赖),但是有些插件有更多的构建顺序依赖。

以上是关于如何使用 Gradle 设置多项目 Grails?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gradle 运行时设置 Grails 端口

如何在 Grails 3 Gradle 项目中控制 H2 驱动程序版本?

Gradle:如何使用并排项目配置多项目设置

Gradle / Grails 应用程序

Gradle 在构建 Grails 项目时给出 ClassNotFoundException

Gradle 3.5 搭建 Grails 3.0 项目配置