Gradle 格拉德尔。调用getProjectDir()不会返回预期的目录
我的Gradle项目中有子项目 因此,在我的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
bulid.gradle
文件中,我有如下代码:
void getDir() {
getProjectDir()
}
configure(project('SubProject')) {
getDir()
}
因此,现在getProjectDir()
insidegetDir()
返回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()}
为什么要在构建脚本中定义方法?我很确定对于您的特殊用例有一个更渐进的解决方案。好的,理想情况下,我希望有一个方法,接收相对路径和一些属性作为映射,并在其中解析相对路径,这取决于它调用的项目的目录,然后创建这些属性。是的,也许有更渐进的解决方案,就像你说的,如果你知道这样一个特性,我会非常感激。