webentwicklung-frage-antwort-db.com.de

Gradle: Abrufen des Stammverzeichnisses des Projektverzeichnisses, wenn mit einer benutzerdefinierten Builddatei begonnen wird

Die Struktur meines Gradle-Projekts ist folgende:

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

Um den absoluten Pfad des foo-Ordners zu erhalten, kann ich normalerweise einfach new File('foo').getAbsolutePath() in der Stammdatei build.gradle ausführen.

Dies funktioniert jedoch leider nicht, wenn Sie das Gradle-Skript außerhalb des Projektverzeichnisses ausführen, beispielsweise so:

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

Mit dem vorherigen Befehl sucht gradle nach dem foo-Verzeichnis im übergeordneten Projekt, da ich das Skript von dort aus gestartet habe.

Gibt es eine Möglichkeit, den absoluten Pfad des Projekts abzurufen, in dem sich build.gradle befindet, selbst wenn Sie Ihr Skript von einem anderen Verzeichnis aus starten? Oder gibt es eine andere Möglichkeit, einen Verweis auf ein Verzeichnis in demselben Ordner abzurufen, in dem sich das Skript befindet?

Ich habe es auch mit getClass().protectionDomain.codeSource.location.path versucht, aber es gibt den Pfad zum Gradle-Cache-Verzeichnis zurück.

18

new File('foo') definiert per Definition (siehe JavaDoc) einen Pfad relativ zum aktuellen Arbeitsverzeichnis und hängt davon ab, von wo aus Sie die App aufrufen. Wenn Sie einen Pfad relativ zum Projektordner wünschen, verwenden Sie project.file('foo'), oder project ist der Standard für das Auflösen der Methode, nur file('foo'). Sie erhalten den relativen Pfad für das Projektverzeichnis und nicht für das Arbeitsverzeichnis. Verwenden Sie also file('foo').absolutePath und Sie werden in Ordnung sein.

18
Vampire

Ich bin an diesem Problem vorbeigegangen, indem sichergestellt wurde, dass Java userDir auf das Verzeichnis project (d. H. project.projectDir) oben in meiner build.gradle-Datei gesetzt wurde.

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

Dies kann durch Ausführen einer separaten (Groovy) Codedatei überprüft werden, z.

    println "User Dir: ${System.getProperty( 'user.dir' )}"

Sie können die Gradle-Projektwerte vor und nach der Verwendung dieser Anweisungen ausgeben.

    println  "Root project:   ${project.rootProject}";
    println  "  rootDir:      ${project.rootDir}"
    println  "  projectDir:   ${project.projectDir}";
    println  "  project dir:  ${System.getProperty("user.dir")}";

Wenn Sie über Unterprojekte verfügen, ist projectDir nicht identisch mit rootDir.

Dies hat mein actual Problem nicht behoben, aber es wurde sichergestellt, dass ich die richtige Datei öffne (relativ zum Speicherort von build.gradle).

22
will

Verwenden Sie in der Datei build.gradle einfach projectDir, um den absoluten Pfad der Datei build.gradle abzurufen. Von dort aus können Sie in den Dateien Ihres Projekts navigieren. Lesen Sie dies für weitere Informationen: 

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

1
AliReza19330