web-dev-qa-db-ja.com

Gradle:カスタムビルドファイルで開始するときにルートプロジェクトのディレクトリパスを取得する

私の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キャッシュディレクトリへのパスを返しています。

24

定義によりnew File('foo')(そのJavaDocを参照)は、現在の作業ディレクトリに相対的なパスを作成するため、アプリの呼び出し元に依存します。プロジェクトフォルダーに対する相対パスが必要な場合は、project.file('foo')を使用するか、projectがメソッドを解決するためのデフォルトであるfile('foo')であり、プロジェクトディレクトリに対して解決された相対パスを取得します。作業ディレクトリではありません。 file('foo').absolutePathを使用すれば大丈夫です。

20
Vampire

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

サブプロジェクトがある場合、projectDirrootDirと同じではありません。

これは私のactualの問題を修正していませんが、(build.gradleの場所に関連する)正しいファイルを確実に開いています。

30
will

Build.gradleファイルでは、projectDirを使用してbuild.gradleファイルの絶対パスを取得します。そこから、プロジェクトのファイルをナビゲートできます。詳細についてはこちらをお読みください:

https://www.tutorialspoint.com/gradle/gradle_build_script.htm

2
AliReza19330