Czy można zadeklarować zmienną w Gradle używaną w Javie? Zasadniczo chciałbym zadeklarować niektóre zmienne w build.gradle, a następnie uzyskać (oczywiście) w czasie kompilacji. Podobnie jak makra preprocesora w C / C ++ ...
Przykładem deklaracji może być coś takiego:
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
Czy istnieje sposób na zrobienie czegoś takiego?
java
android
gradle
android-gradle-plugin
klefevre
źródło
źródło
<project>/src/
przypadku, jeśli utworzysz plikdebug/res/values/strings.xml
i inny plikrelease/res/values/strings.xml
, możesz ustawić zasoby dla wersji debugowania i wydań również w nieco czystszy sposób.android
wtyczki? tj. po prostu używaszapply plugin java
? dzięki!Przykład użycia klucza aplikacji Api w aplikacji na Androida (Java i XML)
gradle.properties
build.gradle
Wykorzystanie w kodzie Java
Użycie w kodzie XML
źródło
./gradlew -PAppKey="1234" testdebug
defaultConfig
bloku: stackoverflow.com/a/51521146/321354@string/APP_KEY_2
Przykład użycia właściwości systemowych ustawionych w build.gradle, odczytanych z aplikacji Java (w odpowiedzi na pytanie w komentarzach):
Zasadniczo, używając
test
zadania wbuild.gradle
, z testową metodą zadaniasystemProperty
ustawianą właściwość systemową przekazywaną w czasie wykonywania:A oto pozostała część przykładowego kodu (który prawdopodobnie można wywnioskować, ale i tak jest tu uwzględniony): otrzymuje właściwość systemową
MY-VAR1
, która w czasie wykonywania powinna być ustawiona naVALUE-TEST
:Testcase: jeśli nie
MY-VAR
jest ustawiony, test powinien zakończyć się niepowodzeniem:Uruchom (uwaga: test się kończy):
Przekonałem się, że trudną częścią jest uzyskanie danych wyjściowych z gradle ... Więc logowanie jest skonfigurowane tutaj (slf4j + logback), a plik dziennika pokazuje wyniki (alternatywnie, uruchom
gradle --info cleanTest test
; są też właściwości, które można ustawić na standardowe wyjście konsolę, ale wiesz dlaczego):Jeśli skomentujesz „
systemProperty...
” (co przy okazji działa tylko wtest
zadaniu), to:Dla kompletności, oto logback config (
src/test/resources/logback-test.xml
):Akta:
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
źródło
version = '0.0.1-SNAPSHOT'
kod Java?systemProperty
naprawdę ma sens tylko do testowania, więc rozumiem, dlaczego zrobili to w ten sposób (to nie jest przeoczenie), ale jednocześnie próbowałem również używać gradable do rzeczy, do których nie było przeznaczone (np. DSL aplikacji ), dzięki czemu mogę zidentyfikować. Alternatywnie polecam ładowanie właściwości z pliku właściwości (lub usługi konfiguracyjnej itp.), Ponieważ jeśli nie jest to tryb „testowy”, to jest to tryb „produkcyjny” i wymaga logiki aplikacji. (W każdym razie taka jest teoria.)Podczas tworzenia kompilacji można utworzyć pole konfiguracji kompilacji, które można zastąpić za pomocą zmiennych środowiskowych systemu:
Podczas programowania używana jest funkcja rezerwowa, ale można zastąpić zmienną po uruchomieniu kompilacji na Jenkins lub innym narzędziu.
W Twojej aplikacji build.gradle :
Zmienna będzie dostępna jako
BuildConfig.SERVER_URL
.źródło
Odpowiedź rciovati jest całkowicie poprawna. Chciałem tylko dodać jeszcze jeden smakołyk, że można również tworzyć zmienne dla każdego typu kompilacji w domyślnej części konfiguracyjnej twojego build.gradle. Wyglądałoby to tak:
Umożliwi to dostęp do poprzez
Chciałem tylko zanotować ten scenariusz, jeśli chcesz wspólnej konfiguracji.
źródło
Używam tego kodu i działa bardzo dobrze.
}
źródło
Jak wstawić wynik ciągu funkcji do buildConfigField
Oto przykład daty kompilacji w zestawie formatów czytelnym dla człowieka:
źródło
używam
Opiera się na odpowiedzi Dennisa, ale pobiera ją ze zmiennej środowiskowej.
źródło
Żadna z powyższych odpowiedzi nie dała mi żadnych wskazówek, więc musiałem poświęcić dwie godziny na naukę o Groovy Methods.
Chciałem być w stanie konkurować z produkcją, piaskownicą i lokalnym środowiskiem. Ponieważ jestem leniwy, chciałem zmienić adres URL tylko w jednym miejscu. Oto, co wymyśliłem:
Alternatywna składnia, ponieważ można używać tylko
${variable}
z podwójnymi cudzysłowami w Groovy Methods.Trudno mi było pojąć, że ciągi należy zadeklarować jako ciągi otoczone cudzysłowami. Z powodu tego ograniczenia nie mogłem
API_HOST
bezpośrednio korzystać z referencji , co przede wszystkim chciałem zrobić.źródło