2017-01-13 3 views
6

カスタムビルドファイルをルートプロジェクトディレクトリのパスを取得することは、私のGradleプロジェクトの構造は以下の通りです:のGradle:起動時に

Project 
├── app 
    └── build.gradle 
├── foo 
    └── bar.txt 
· 
· 
· 
└── build.gradle 

通常、私はただ単に行うことができますfooフォルダの絶対パスを取得しますルートbuild.gradlenew File('foo').getAbsolutePath()にあります。

しかし、あなたはこのような何かやっ例えば、プロジェクトディレクトリの外部からのGradleスクリプトを実行した場合、これは残念ながら動作しません。

$ trunk/gradlew -b trunk/build.gradle tasks 

前のコマンドのGradleでは、中fooディレクトリを探しています私はそこからスクリプトを開始したので、プロジェクトの親です。

別のディレクトリからスクリプトを起動した場合でも、build.gradleの絶対パスを取得する方法はありますか?または、スクリプトがある同じフォルダ内のディレクトリの参照を取得する他の方法はありますか?

私はgetClass().protectionDomain.codeSource.location.pathでも試してみましたが、それはgradle cacheディレクトリへのパスを返しています。

答えて

8

new File('foo')(定義:JavaDoc)は、現在の作業ディレクトリとの相対的なパスを作成するため、アプリケーションをどこから呼び出すかによって異なります。プロジェクトフォルダに相対的なパスを使用する場合は、project.file('foo')を使用するか、projectがメソッドを解決するためのデフォルトであるfile('foo')であり、相対パスは作業ディレクトリではなくプロジェクトディレクトリに対して解決されます。したがって、file('foo').absolutePathを使用すれば問題ありません。

System.setProperty("user.dir", project.projectDir.toString()) 
    println " project dir: "+ System.getProperty("user.dir"); 

これは、実行することで確認することができ、次のよう

+1

感謝ねえ!そして私はちょうどことを実現私は 'rootProject.projectDir'を使って現在のプロジェクトディレクトリへのパスを得ることができます。しかし、私の場合、あなたのソリューションはより簡単できれいになります –

+0

Netbeansでは、少なくとも' File( 'foo') 'は必ずしもgradleではありません。ファイルライフを構築する。私は私のfooがNetbeansの 'userDir'にあったことを発見するまでバグがあったと思った。 – will

+0

@小文字で' 'ファイル' "? – Vampire

8

私は、JavaのuserDirは私build.gradleファイルの先頭にプロジェクトディレクトリ(すなわちproject.projectDir)に設定した保証することによって、この問題を過ぎました

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")}"; 

あなたはサブプロジェクトを持っている場合は、projectDirrootDirと同じではありません。魔法のように動作

これは私の実際問題を解決していないが、それは私がbuild.gradleの場所への相対的な正しいファイルを(開いてることを保証している。