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

mznpcxlj  于 2023-06-06  发布在  其他
关注(0)|答案(8)|浏览(687)

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

apply from: "../../gradlebase/base1.gradle"

base1.gradle示例

println getScriptLocation()
wtlkbnrh

wtlkbnrh1#

我不确定这是否被认为是一个内部接口,但是DefaultScriptHandler有一个getSourceFile()方法,并且当前示例可以通过buildscript属性访问,所以你可以只使用buildscript.sourceFile。它是指向当前脚本的File示例

yzckvree

yzckvree2#

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

println project.buildscript.sourceFile

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

xienkqul

xienkqul3#

我把它从堆栈中拉出来。

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 })
af7jpaap

af7jpaap4#

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

vwhgwdsa

vwhgwdsa5#

我目前的解决方法是从调用脚本注入路径。这是一个丑陋的黑客。
调用方脚本必须知道基脚本的位置。在调用之前,我将此路径保存在属性中:

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

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

kg7wmglp

kg7wmglp6#

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

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

ecfdbz9o7#

此解决方案尚未使用'apply from'进行测试,但已使用settings.gradle进行测试
Gradle有一个Script.file(String path)函数。我通过做来解决我的问题

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

并且'out'目录总是紧挨着调用此行的build.gradle。

dojqjjoe

dojqjjoe8#

我正在寻找gradleKotlinDSL文件的位置,就像我们为shell脚本所做的那样
导出LNX_SPI_ROOT="$(cd“$(dirname“${BASH_SOURCE[0]}”)”&& pwd)”

相关问题