2011-10-10 16 views
10

Najwyraźniej nie rozumiem, co się tutaj dzieje.Próba zrozumienia różnorakich właściwości projektu

Domyślam się, że prop2 i prop3 nie mogą być dostępne, ponieważ są zmiennymi zamiast "właściwościami projektu".

Pojawiło się pytanie, ponieważ chciałbym, aby zmienne prop2 i prop3 były widoczne z poziomu metody "doTheThing()", ale nie chcę ich przekazywać. Chcę, aby zmienne były globalnie dostępne do zadań, metod i klas (ale tylko z wewnątrz samego skryptu budowania) - i chcę, żeby były pisane na maszynie (dlatego nie można zaakceptować definicji prop1).

Naprawdę, myślę, że to o co proszę, to pomoc w zrozumieniu, czym jest własność projektu Gradle i co właściwie robi składnia "prop1 =" bla ".

Przeczytałem podręcznik użytkownika Gradle, a także Gradle w działaniu - jeśli już wyjaśniono tę koncepcję, proszę wskazać mi właściwą sekcję (może pomalowałem ją w tym czasie, nie rozumiejąc, co to było).

prop1 = "blah" 
String prop2 = "bleah" 
def prop3 = "blargh" 

task testPropAccess << { 
    println "1: $prop1" 
    println "2: $prop2" 
    println "3: $prop3" 
    doTheThing() 
} 

private void doTheThing(){ 
    println "4: $prop1" 
    println "5: $prop2" // error: Could not find property 'prop2' on root project 'script' 
    println "6: $prop3" // error: Could not find property 'prop3' on root project 'script' 
} 
+0

Powinno to również pomóc: http://groovy.codehaus.org/Scoping+i+memantyki+%22def%22 – rodion

+0

@Rodion - ten link był bardzo przydatny, dziękuję. Chyba muszę zrobić więcej badań zorientowanych na Groovy. – Shorn

+0

Dla każdego, kto chciałby zrobić podobne, moim bieżącym sposobem obejścia tego problemu jest zdefiniowanie szerokich właściwości skryptu budującego w klasie takiej jak ta: 'class StaticProps { static String prop4 = System.getProperty (" prop4 " "wibble") } ' a następnie wykorzystać je w ten sposób: ' System.getProperty ("prop4" StaticProps.prop4) '' Dlaczego – Shorn

Odpowiedz

19

Kiedy deklarujesz zmienną na poziomie najbardziej zewnętrznej (jak w drugim i trzecim zestawieniu), staje się lokalna zmienna run metody skryptu. To naprawdę tylko zachowanie Groovy i nic, co Gradle może łatwo zmienić.

Jeśli chcesz ekwiwalent zmiennej globalnej, po prostu przypisz wartość do zmiennej niezwiązanej (jak w pierwszym wyciągu). To dodaje właściwość dynamiczną do obiektu Gradle Project, który jest widoczny w całym skrypcie budowania (chyba że jest shadowowany). Innymi słowy, prop1 = "blah" jest odpowiednikiem project.prop1 = "blah".

Jeśli chcesz uzyskać odpowiednik wpisanej zmiennej globalnej, musisz poczekać, aż Gradle uaktualni się do Groovy 1.8, co jest możliwe dzięki adnotacji @Field. Lub piszesz wtyczkę, która miesza obiekt konwencji do obiektu Project (ale nie nadaje się do skryptów ad-hoc).

+16

Dla każdego, kto się na to natknie, zaleca się teraz, aby robiąc to, co sugerował Peter, napisz" ext.prop1 = "bla". Starsza technika nadal działa, ale jest przestarzała i generuje ostrzeżenie. Używanie ext jest po prostu fajnym sposobem na wyraźne stwierdzenie, że zamierzasz utworzyć nową właściwość. Jeśli uważasz, że korzystasz z istniejącej nieruchomości i nieświadomie tworzysz nową, może to być bardzo frustrujące, więc jest to prawdopodobnie całkiem niezła zmiana. –

+0

Cześć, Peter. Szybkie pytanie, utworzyłem zmienną 'ext.blah = 'foobar'' na najwyższym poziomie pliku build.gradle, ale nie jest to możliwe w przypadku' buildscript', jakikolwiek pomysł? – Bob

+0

To powinno być osobne pytanie (jeśli jeszcze nie istnieje). –

Powiązane problemy