私のGradleプロジェクトの構造は次のとおりです。
Project
├── app
└── build.gradle
├── foo
└── bar.txt
·
·
·
└── build.gradle
通常、foo
フォルダーの絶対パスを取得するには、ルートbuild.gradle
ファイルでnew File('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').absolutePath
を使用すれば大丈夫です。
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
と同じではありません。
これは私のactualの問題を修正していませんが、(build.gradle
の場所に関連する)正しいファイルを確実に開いています。
Build.gradleファイルでは、projectDir
を使用してbuild.gradleファイルの絶対パスを取得します。そこから、プロジェクトのファイルをナビゲートできます。詳細についてはこちらをお読みください:
https://www.tutorialspoint.com/gradle/gradle_build_script.htm