Gradle:从自定义生成文件开始时获取根项目目录路径
我的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
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')。绝对路径
,您会没事的。我通过确保JavauserDir
被设置到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在NetbeansuserDir
@你能把它全部小写吗?@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以及其他必须首先出现的必填位之后。