File 如何找到当前gradle脚本的路径?
我们在一个中心点上使用一些Gradle基脚本。这些脚本包含在大量脚本的“apply from:”中。此基本脚本需要访问与脚本相关的文件。如何找到基本脚本的位置 一个build.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
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中,所以我认为这是安全的。