如何使用 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并没有应用groovy
或java
插件,只是添加了java
插件正常添加的一些配置,即compile
、runtime
和@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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Grails 3 Gradle 项目中控制 H2 驱动程序版本?