Gradle:从自定义构建文件开始获取根项目目录路径

Rob*_*rdi 27 groovy gradle

我的Gradle项目的结构如下:

Project
??? app
     ??? build.gradle
??? foo
     ??? bar.txt
·
·
·
??? build.gradle
Run Code Online (Sandbox Code Playgroud)

通常要获取foo文件夹的绝对路径,我只需new File('foo').getAbsolutePath()在根build.gradle文件中执行即可.

但遗憾的是,如果从项目目录外部运行gradle脚本,则无法执行此操作,例如执行以下操作:

$ trunk/gradlew -b trunk/build.gradle tasks
Run Code Online (Sandbox Code Playgroud)

使用上一个命令,gradle正在查找foo项目父项中的目录,因为我从那里启动了脚本.

有没有办法获得build.gradle所在项目的绝对路径,即使你从另一个目录启动你的脚本?或者有没有其他方法来获取脚本所在的同一文件夹中的目录引用?

我也尝试过,getClass().protectionDomain.codeSource.location.path但它返回了gradle缓存目录的路径.

wil*_*ill 35

我通过确保将Java userDir设置到我文件顶部的项目目录(即project.projectDir)来解决此问题build.gradle,如下所示:

    System.setProperty( "user.dir", project.projectDir.toString() )
    println  "  project dir:  "+ System.getProperty("user.dir");
Run Code Online (Sandbox Code Playgroud)

这可以通过执行单独的(Groovy)代码文件来检查,例如:

    println "User Dir: ${System.getProperty( 'user.dir' )}"
Run Code Online (Sandbox Code Playgroud)

您可以在使用这些语句之前和之后输出Gradle项目值.

    println  "Root project:   ${project.rootProject}";
    println  "  rootDir:      ${project.rootDir}"
    println  "  projectDir:   ${project.projectDir}";
    println  "  project dir:  ${System.getProperty("user.dir")}";
Run Code Online (Sandbox Code Playgroud)

如果你有子项目,projectDir则不一样rootDir.

这并没有解决我的实际问题,但它确保我打开正确的文件(相对于的位置)build.gradle.


Vam*_*ire 21

new File('foo')根据定义(查看其JavaDoc)创建一个相对于当前工作目录的路径,因此取决于您从哪里调用应用程序.如果您想要一个相对于项目文件夹的路径,请使用project.file('foo'),或者project只是解析方法的默认file('foo')路径,您将获得针对项目目录而不是工作目录解析的相对路径.所以使用file('foo').absolutePath,你会没事的.

  • 嘿谢谢!这就像魅力!我只是意识到我可以通过`rootProject.projectDir`获取当前项目目录的路径.但就我而言,您的解决方案更简单,更清洁. (8认同)

Ali*_*330 8

在 build.gradle 文件中只是projectDir用来获取build.gradle 文件的绝对路径。从那里你可以浏览你的项目文件。阅读本文了解更多信息:

https://www.tutorialspoint.com/gradle/gradle_build_script.htm