我的Gradle项目中有子项目

因此,在我的bulid.gradle文件中,我有如下代码:

void getDir() {
    getProjectDir()
}

configure(project('SubProject')) {
    getDir()
}

因此,现在getProjectDir()中的getDir()返回MainProject目录,但是我希望此调用返回SubProject目录。

希望您的帮助,在此先感谢

最佳答案

您提供的代码是根项目构建脚本的一部分,因此Gradle将以主(根)项目实例作为上下文执行:在这种情况下,getProjectDir()调用被删除到根项目实例,这就是为什么要返回MainProject目录的原因。

我认为您的方法“getDir”应将Project实例作为参数,然后您可以编写如下内容:

void getDir(Project proj) {
    def dir =  proj.getProjectDir()
    println "Directory is : " + dir
}

configure(project('SubProject')) { proj ->
    getDir(proj)
}

编辑

如果要避免将Project实例作为参数传递,则可以将Groovy Closer用作技巧:

1)将getDir方法转换为真正的Closure,

2)在从您的configure方法调用getDir闭包之前,设置目标委托(delegate)对象

以下代码应该工作:
// a closure that invoke getProjectDir on the delegate Project
def getDir = {
    println "project directory is: " + getProjectDir()
}

configure(project('subproject')) { proj ->
    // set closure target delegate to SubProject instance
    getDir.delegate = proj
    getDir()
}

10-08 12:05