Gradle:从自定义生成文件开始时获取根项目目录路径

Gradle:从自定义生成文件开始时获取根项目目录路径,gradle,groovy,Gradle,Groovy,我的Gradle项目的结构如下: Project ├── app └── build.gradle ├── foo └── bar.txt · · · └── build.gradle 通常,要获取foo文件夹的绝对路径,我只需在根build.gradle文件中执行newfile('foo').getAbsolutePath() 但不幸的是,如果您从项目目录之外运行gradle脚本,例如执行以下操作,则此操作不起作用: $ trunk/gradlew -b trunk/bu

我的Gradle项目的结构如下:

Project
├── app
     └── build.gradle
├── foo
     └── bar.txt
·
·
·
└── build.gradle
通常,要获取
foo
文件夹的绝对路径,我只需在根
build.gradle
文件中执行
newfile('foo').getAbsolutePath()

但不幸的是,如果您从项目目录之外运行gradle脚本,例如执行以下操作,则此操作不起作用:

$ trunk/gradlew -b trunk/build.gradle tasks
使用前面的命令,gradle正在项目父目录中查找
foo
目录,因为我是从那里开始脚本的

是否有方法获取build.gradle所在项目的绝对路径,即使您从另一个目录启动脚本?或者是否有其他方法可以获取脚本所在文件夹中目录的引用


我也尝试过使用
getClass().protectionDomain.codeSource.location.path
,但它正在返回到gradle缓存目录的路径。

new File('foo')
根据定义(查看其JavaDoc)创建一个相对于当前工作目录的路径,因此取决于调用应用程序的位置。如果您想要相对于项目文件夹的路径,请使用
project.file('foo')
,或者
project
是解析方法的默认值,只需
file('foo')
,您就可以根据项目目录而不是工作目录解析相对路径。因此,请使用
file('foo')。绝对路径
,您会没事的。

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

    System.setProperty( "user.dir", project.projectDir.toString() )
    println  "  project dir:  "+ System.getProperty("user.dir");
这可以通过执行单独的(Groovy)代码文件来检查,例如:

    println "User Dir: ${System.getProperty( 'user.dir' )}"
您可以在使用这些语句之前和之后输出Gradle项目值

    println  "Root project:   ${project.rootProject}";
    println  "  rootDir:      ${project.rootDir}"
    println  "  projectDir:   ${project.projectDir}";
    println  "  project dir:  ${System.getProperty("user.dir")}";
如果您有子项目,
projectDir
rootDir
不同


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

的位置),只需使用
projectDir
获取build.gradle文件的绝对路径。从那里,您可以导航项目的文件。有关详细信息,请阅读以下内容:


嘿,谢谢!这很有魅力!我刚刚意识到我可以通过
rootProject.projectDir
获得当前项目目录的路径。但在我的情况下,您的解决方案更简单、更干净。使用Netbeans,至少可以通过
文件('foo'))
并不总是gradle.build文件存在的地方。我一直以为我有一个bug,直到我发现我的foo在Netbeans
userDir
@你能把它全部小写吗?@vamper…谢谢,是的,我很欣赏它的区别。但是,我需要“
新文件('foo')
”构建是因为我正在构建Java和Groovy中的现有测试脚本和程序,这些脚本和程序至少在一切开始时依赖于项目目录作为“当前工作目录”。设置Java的
System.userDir
值是实现这一点的标准JVM方法。如果需要,请随时进行改进/选择它们更健壮。@很好,这是一个不同于OP请求的用例。假设您使用
Exec
JavaExec
调用现有脚本和程序,您还可以将这些外部进程的工作目录单独指定为项目目录。如果您有多项目构建,其中工具根据各自的项目需要不同的工作目录。如果您只有一个项目,并且您的脚本和工具在Gradle过程中在线评估,那么设置
user.dir
可能是最佳解决方案。$rootDir/foo还提供了foo的绝对路径。$rootDir是基础或者gradleLiterally中的根目录,位于
build.gradle
?当我尝试获取
时,只允许在plugins{}块之前使用buildscript{}和其他plugins{}脚本块,不允许使用其他语句
。是的,正确--在plugins和buildscript以及其他必须首先出现的必填位之后。