File 如何找到当前gradle脚本的路径?

File 如何找到当前gradle脚本的路径?,file,gradle,File,Gradle,我们在一个中心点上使用一些Gradle基脚本。这些脚本包含在大量脚本的“apply from:”中。此基本脚本需要访问与脚本相关的文件。如何找到基本脚本的位置 一个build.gradle的示例: apply from: "../../gradlebase/base1.gradle" base1.gradle的样本 println getScriptLocation() 您可以在相对路径中搜索此脚本,如: if(new File(rootDir,'../path/A.gradle').exi

我们在一个中心点上使用一些Gradle基脚本。这些脚本包含在大量脚本的“apply from:”中。此基本脚本需要访问与脚本相关的文件。如何找到基本脚本的位置

一个build.gradle的示例:

apply from: "../../gradlebase/base1.gradle"
base1.gradle的样本

println getScriptLocation()

您可以在相对路径中搜索此脚本,如:

if(new File(rootDir,'../path/A.gradle').exists ()){
    apply from: '../path/A.gradle'
}

我当前的解决方法是从调用脚本注入路径。这是一个丑陋的黑客

调用方脚本必须知道基本脚本的位置。在调用之前,我将此路径保存在属性中:

ext.scriptPath = '../../gradlebase'
apply from: "${scriptPath}/base1.gradle"

在base1.gradle中,我还可以访问属性${scriptPath}

另一个解决方案是在全局gradle设置中为a.gradle的位置设置属性:{userhome}/.gradle/gradle.properties

我仍然不确定我是否理解这个问题,但您可以使用以下代码找到当前gradle脚本的路径:

println project.buildscript.sourceFile

它给出当前正在运行的脚本的完整路径。这就是您要找的吗?

此解决方案尚未使用“从应用”进行测试,但已使用settings.gradle进行了测试

Gradle有一个Script.file(字符串路径)函数。我用行动解决了我的问题

def outDir = file("out")
def releaseDir = new File(outDir, "release")

“out”目录总是在build.gradle的旁边,在build.gradle中调用这一行。

我正在将它从堆栈中拉出

buildscript {
    def root = file('.').toString();
    // We have to seek through, since groovy/gradle introduces
    // a lot of abstraction that we see in the trace as extra frames.
    // Fortunately, the first frame in the build dir is always going
    // to be this script.
    buildscript.metaClass.__script__ = file(
        Thread.currentThread().stackTrace.find { ste -> 
            ste.fileName?.startsWith root 
        }.fileName
    )

    // later, still in buildscript

    def libDir = "${buildscript.__script__.parent}/lib"


    classpath files("${libDir}/custom-plugin.jar")
}
// This is important to do if you intend to use this path outside of 
//   buildscript{}, since everything else is pretty asynchronous, and
//   they all share the buildscript object.
def __buildscripts__ = buildscript.__script__.parent;
适用于不喜欢杂乱的用户的精简版:

    String r = file('.').toString();
buildscript.metaClass.__script__ = file(Thread.currentThread().stackTrace*.fileName?.find { it.startsWith r })


我不确定这是否被视为一个内部接口,但是
DefaultScriptHandler
有一个
getSourceFile()
方法,并且当前实例可以通过属性访问,因此您可以只使用
buildscript.sourceFile
。这是一个指向当前脚本的
文件
实例

我不理解您的答案。从你的样品中。如何在脚本中找到A.gradle到A.gradle的路径。这需要我加载A.gradle.properties。为了使用它,您必须知道A.gradle的可能位置。如果脚本只存在一个,这可能是一个解决方案。如果我为不同的分支多次签出工作区,这将不起作用。你还做了其他事情吗?我可以试试,但我觉得我不太理解这个问题。有没有最简单的工作示例?这是我目前的解决方法。问题是如何检测当前脚本的位置/路径?该脚本是在存储库中签入的,并且在任何开发人员系统上都有不同的位置。您是否有任何简单的工作示例?只是想知道你到底需要实现什么?我添加了一个最小的示例。这将返回项目构建脚本的位置。在build.gradle的示例中。如果我把它叫做base1.gradle。但我需要base1.gradle的位置。这也是意料之中的。这是该项目的构建脚本。而不是当前脚本。您需要
build.gradle
中的
base1.gradle
位置,是吗?否,我需要base1.gradle在base1.gradle中的位置。build.gradle当然知道base1.gradle的位置。看看我的变通方法。不,我明白。这是不可能的。Gradle将每个应用脚本的workingDir设置为与调用的脚本相同。没有你或其他的解决方法是不可能的。正确的答案是没有“项目”。只有“buildscript.sourceFile”返回正确的路径。是的,它始终与主build.gradle相关,而从不与内联gradle文件相关。抱歉,我没有意识到您使用的是“apply from”I replace“。startsWith root“with”.endsWith”.gradle'”并且它可以工作。非常酷的黑客您想要
base1.gradle
base1.gradle
的完整路径吗?您可以从
buildscript.sourceFile
获取它。还是希望调用脚本使用相对路径?如果您知道调用者是
build.gradle
文件,则可以从
buildFile
获取它。你能把样本输出添加到你的问题中吗?是的,这是正确的答案。同样在这个问题/答案中:它在API中,所以我认为这是安全的。