2017-01-01 13 views
2

我有根项目和子项目(:child)。 根构建看起来是这样的:在root中定义的关闭在子中不可见

def foo = { 
    println("foo") 
} 

allprojects { 
    task bar << { 
    println(project.name + ":bar") 
    } 

    afterEvaluate { 
    foo() 
    } 
} 

运行gradle bar打印:

foo 
foo 
:bar 
:child:bar 
child:bar 
parent:bar 

这是有意义的。但是,IRL我需要foo由孩子的构建文件调用(因为我希望它只能被某些子模块调用)。 的documentation似乎是足够清楚的:In a multi-project build, sub-projects inherit the properties and methods of their parent project

然而,在移动“afterEvaluate”块上方插入child/build.gradle导致错误:Could not find method foo() for arguments [] on project ':child' of type org.gradle.api.Project

为什么会发生这种情况,我该如何解决这个问题?我已经尝试了一大堆不同的变化 - 四处移动def(到buildscriptallprojects,到ext,到allprojects.ext,使代替的方法等在其分机一个变量,)中,参照它不同(如rootProject.foorootProject.foo()ext.foo()等) - 似乎没有任何工作。

任何想法?

回答

1

需要在ext名称空间中声明变量以便将它们传播到下游。尝试:

ext.foo = { 
    println("foo") 
} 

裁判:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html

+0

好吧,看起来像这样的作品。现在,接下来的问题是,如何在_all_模块被评估之后运行它,而不仅仅是这一个?看起来我的下一个问题是,在另一个孩子知道它取决于这个孩子之前,child/foo会被执行。有没有一个技巧来解决这个问题?我尝试用'rootProject.afterEvaluate'替换它,但似乎什么都不做:/ – Dima

相关问题