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

4
我正在尝试为一个多项目的Grails应用程序设置Gradle构建脚本。我已经使用grails-gradle插件并成功创建了一个新的应用程序。
但是,当我想将现有的Grails多项目应用程序转换为使用Gradle时,遇到了一些问题。
我已在我的settings.gradle文件中声明了所有子项目,如下所示:
include 'core',
//Plugins 'plugin1', 'plugin2'
对于每个子项目,我在它们自己的build.gradle文件中设置了它们的依赖关系。例如,plugin1依赖于plugin2,因此我在plugin1的build.gradle文件中声明了以下内容:
dependencies {
  compile project(':plugin2')
}
然而,当我尝试运行gradle test命令时,出现了以下错误:

UNRESOLVED DEPENDENCIES

出错原因:
执行任务“:plugin1:test”失败。
原因:无法解决配置“:plugin1:runtime”中的所有依赖项:
- 未解决的依赖项:{}#plugin2;1.5-SNAPSHOT:在{}#plugin2;1.5-SNAPSHOT中找不到配置“default”。它是从{}#plugin1;1.5-SNAPSHOT编译所需的

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

我已经在每个子项目的BuildConfig.groovy中声明了内联依赖项,我还需要在Gradle中声明吗?


在主构建文件中,通过subprojects闭包将'grails'插件添加到子项目中。堆栈跟踪可以在此处查看:Stacktrace - Mathias Åhsberg
2个回答

3
我回答自己的问题,如果有其他人有同样的问题。
我想为一个多项目Grails应用程序设置构建顺序(一个主应用程序依赖于几个位于不同文件夹中的Grails插件)。
最终,在每个子项目的构建文件中声明了dependsOn()
例如,我的主应用程序依赖于pluginA和pluginB。PluginB依赖于PluginC。
在我的根build.gradle中,我声明了:
dependsOnChildren()

在我的根目录下的settings.gradle文件中,我声明了:

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

在 pluginB 的 build.gradle 文件中,我声明了:
dependsOn(":pluginC")

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

我在GRAILS-7296中找到了解决方法。

我为每个子项目创建了一个_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应用程序。

1
原来grails-gradle-plugin不适用于groovy或java插件,只添加了一些通常由java插件添加的配置,即compile、runtime和test。因此,在跨项目依赖中没有默认配置,也没有存储项目生成的工件的archive配置。
因此,目前该插件似乎不支持这种配置。请注意,通常情况下,Grails插件依赖项也不在build.gradle中处理。我认为我们可以尝试修复它,但我意识到我并不完全理解您的用例。
我相信您现在想要实现的是编写等效于...的内容。
grails.plugin.location.'plugin-tws-communication' = "../plugin-tws-communication"

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接