我的Gradle项目的结构如下:
Project ??? app ??? build.gradle ??? foo ??? bar.txt · · · ??? build.gradle
通常要获取foo
文件夹的绝对路径,我只需new File('foo').getAbsolutePath()
在根build.gradle
文件中执行即可.
但遗憾的是,如果从项目目录外部运行gradle脚本,则无法执行此操作,例如执行以下操作:
$ trunk/gradlew -b trunk/build.gradle tasks
使用上一个命令,gradle正在查找foo
项目父项中的目录,因为我从那里启动了脚本.
有没有办法获得build.gradle所在项目的绝对路径,即使你从另一个目录启动你的脚本?或者有没有其他方法来获取脚本所在的同一文件夹中的目录引用?
我也尝试过,getClass().protectionDomain.codeSource.location.path
但它返回了gradle缓存目录的路径.
我通过确保将Java userDir
设置到我文件顶部的项目目录(即project.projectDir
)来解决此问题build.gradle
,如下所示:
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
.
new File('foo')
根据定义(查看其JavaDoc)创建一个相对于当前工作目录的路径,因此取决于您从哪里调用应用程序.如果您想要一个相对于项目文件夹的路径,请使用project.file('foo')
,或者project
只是解析方法的默认file('foo')
路径,您将获得针对项目目录而不是工作目录解析的相对路径.所以使用file('foo').absolutePath
,你会没事的.