Gradle 格拉德尔。调用getProjectDir()不会返回预期的目录

Gradle 格拉德尔。调用getProjectDir()不会返回预期的目录,gradle,build.gradle,gradle-plugin,Gradle,Build.gradle,Gradle Plugin,我的Gradle项目中有子项目 因此,在我的bulid.gradle文件中,我有如下代码: void getDir() { getProjectDir() } configure(project('SubProject')) { getDir() } 因此,现在getProjectDir()insidegetDir()返回MainProjectdir,但我希望这个调用返回SubProjectdir 希望得到您的帮助,提前感谢您提供的代码是根项目构建脚本的一部分,因此Gradl

我的Gradle项目中有子项目

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

void getDir() {
    getProjectDir()
}

configure(project('SubProject')) {
    getDir()
}
因此,现在
getProjectDir()
inside
getDir()
返回
MainProject
dir,但我希望这个调用返回
SubProject
dir


希望得到您的帮助,提前感谢

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

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

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

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

如果希望避免将项目实例作为参数传递,则可以使用Groovy Closer作为一种攻击:

1) 将getDir方法转换为实闭包

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

以下代码应该可以工作:

// 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() 
}

谢谢你的回答。是的,我知道这个解决方案,但在我的例子中,我希望避免将项目作为参数传递。是否有一些黑客如何做到这一点而不传递额外的参数?类似于:基于调用的
Closure
getDir()
更改
getDir()
的内部作用域。您可以使用Groovy Closure delegation特性作为一种攻击,但这意味着您需要重写“getDir()”方法并将其转换为闭包。然后,在调用它之前,您需要在configure块内更改此闭包的委托。以下代码应该可以工作:
def getDir={println”项目目录是:“+getProjectDir()}配置(项目('subproject')){proj->getDir.delegate=proj getDir()}
为什么要在构建脚本中定义方法?我很确定对于您的特殊用例有一个更渐进的解决方案。好的,理想情况下,我希望有一个方法,接收相对路径和一些属性作为映射,并在其中解析相对路径,这取决于它调用的项目的目录,然后创建这些属性。是的,也许有更渐进的解决方案,就像你说的,如果你知道这样一个特性,我会非常感激。