我们的构建在gradle中使用具有动态方法的自定义插件扩展。这在gradle 2.1中运行良好,但是在2.2中不再调用methodMissing而且我得到以下异常(这里是由部分引起的):
Caused by: org.gradle.api.internal.MissingMethodException: Could not find method common() for arguments [api] on org.gradle.api.internal.artifacts.dsl.DefaultComponentModuleMetadataHandler_Decorated@1bef1304.
at org.gradle.api.internal.AbstractDynamicObject.methodMissingException(AbstractDynamicObject.java:68)
at org.gradle.api.internal.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:56)
at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:172)
at org.gradle.api.internal.artifacts.dsl.DefaultComponentModuleMetadataHandler_Decorated.invokeMethod(Unknown Source)
...
如何使用gradle 2.2在我们的构建系统中运行动态函数?
背景:
这些动态方法用于几个方面,但一个是简化项目依赖于其他项目的方式(它是一个非常大的系统,有超过80个子项目,每个子项目可能有多个命名的API(公共,内部,附加组件,等))。
这是我的插件申请:
void apply(Project project) {
project.subprojects.each { subproject ->
subproject.extensions.create("modules", ModuleExtension.class ) }
}
除了methodMissing之外,ModuleExtension没有变量或函数:
def methodMissing(String name, args)
{
//return project dependency based on name/args. This no longer gets called in 2.2!
}
gradle文件中的示例用法:
dependencies {
compile module.nameOfModule( "name of api" )
}
我还在ModuleExtension中覆盖了以下内容,只是为了查看它们是否被调用,但它们不是:
def invokeMethod(String name, args)
def propertyMissing(String name)
def propertyMissing(String name, value)
答案 0 :(得分:0)
我实际上无法在Gradle 2.2中重现此问题。但是,这有点滥用Gradle扩展。如果您只是想要一个全局可用的对象,我只需将其添加为项目额外属性。这样做的好处是无需为每个子项目创建,因为项目从其父项继承属性。
ext {
modules = new ModuleExtension()
}
修改:这是因为Gradle 2.2中引入了对module replacements的新支持。 modules
块中的符号dependencies
现在委托给ComponentModuleMetadataHandler
而不是您的扩展程序。您必须使用modules
以外的其他内容重命名您的扩展程序,或使用project.modules.nameOfModule
限定通话。