2017-01-13 26 views
6

Struktura mojego projektu Gradle jest następujący:Gradle: coraz ścieżkę katalogu głównego projektu, gdy wychodząc z plikiem zwyczaj budowania

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

Normalnie, aby uzyskać bezwzględną ścieżkę do folderu foo mogę po prostu zrobić new File('foo').getAbsolutePath() w pliku root build.gradle.

Ale to niestety nie działa po uruchomieniu Gradle skrypt spoza katalogu projektu, na przykład robiąc coś takiego:

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

z poprzednim polecenia Gradle poszukuje katalogu w foo rodzic Projektu, ponieważ zacząłem od tego skryptu.

Czy istnieje sposób uzyskania absolutnej ścieżki projektu, w której znajduje się build.gradle, nawet jeśli skrypt zostanie uruchomiony z innego katalogu? Czy istnieje inny sposób uzyskania odniesienia do katalogu w tym samym folderze, w którym znajduje się skrypt?

Próbowałem również z getClass().protectionDomain.codeSource.location.path, ale zwraca ścieżkę do katalogu pamięci podręcznej gradle.

Odpowiedz

8

new File('foo') z definicji (patrz jego JavaDoc) tworzy ścieżkę względem bieżącego katalogu roboczego, więc zależy od tego, z której aplikacji wywoływana jest aplikacja. Aby uzyskać ścieżkę względem folderu projektu, należy użyć project.file('foo') lub jako project jest domyślną metodą rozpoznawania metody tylko file('foo'), a ścieżka względna zostanie rozstrzygnięta względem katalogu projektu, a nie katalogu roboczego. Więc używaj file('foo').absolutePath, a wszystko będzie dobrze.

+1

Hej dzięki! To działa jak urok! A ja po prostu sobie sprawę, że Mogę uzyskać ścieżkę do bieżącego katalogu projektu poprzez 'rootProject.projectDir', ale w moim przypadku twoje rozwiązanie jest łatwiejsze i czystsze –

+0

Z Netbeans co najmniej' File ('foo') 'NIE jest zawsze miejscem gradle. build file lives Myślałem, że mam błąd, dopóki nie odkryłem, że moje foo jest w Netbeans 'userDir' – will

+0

@ będziesz mieć wszystko małe," 'file'"? – Vampire

8

mam obok tego problemu poprzez zapewnienie Java userDir został ustawiony do katalogu projektu (tj project.projectDir) w górnej części mojego pliku build.gradle, co następuje:

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

Można to sprawdzić wykonując oddzielny plik (Groovy), taki jak:

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

Możesz wysyłać wartości projektu Gradle przed i po użyciu tych instrukcji.

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

Jeśli masz podprojektów, projectDir nie jest taka sama jak rootDir.

To nie ustaliła mój rzeczywistą problemu, ale zapewnił, że jestem otwierając odpowiedni plik (w stosunku do lokalizacji build.gradle.