java - scripts - groovy gradle
¿Es posible declarar una variable en Gradle utilizable en Java? (7)
Generar constantes de Java
android {
buildTypes {
debug {
buildConfigField "int", "FOO", "42"
buildConfigField "String", "FOO_STRING", "/"foo/""
buildConfigField "boolean", "LOG", "true"
}
release {
buildConfigField "int", "FOO", "52"
buildConfigField "String", "FOO_STRING", "/"bar/""
buildConfigField "boolean", "LOG", "false"
}
}
}
Puedes acceder a ellos con BuildConfig.FOO
Generar recursos de Android
android {
buildTypes {
debug{
resValue "string", "app_name", "My App Name Debug"
}
release {
resValue "string", "app_name", "My App Name"
}
}
}
Puede acceder a ellos de la forma habitual con @string/app_name
o R.string.app_name
¿Es posible declarar una variable en Gradle utilizable en Java? Básicamente, me gustaría declarar algunas variables en build.gradle y luego obtenerlas (obviamente) en el momento de la compilación. Al igual que las macros de preprocesador en C / C ++ ...
Un ejemplo de declaración sería algo así ...
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
¿Hay alguna manera de hacer algo así?
Un ejemplo de uso de una clave de aplicación Api en una aplicación de Android (Java y XML)
gradle.properties
AppKey="XXXX-XXXX"
construir.gradle
buildTypes {
//...
buildTypes.each {
it.buildConfigField ''String'', ''APP_KEY_1'', AppKey
it.resValue ''string'', ''APP_KEY_2'', AppKey
}
}
Uso en código java
Log.d("UserActivity", "onCreate, APP_KEY: " + getString(R.string.APP_KEY_2));
BuildConfig.APP_KEY_1
Uso en código xml
<data android:scheme="@string/APP_KEY_2" />
Ejemplo de uso de las propiedades del sistema, establecido en build.gradle, leído desde la aplicación Java (seguimiento de la pregunta en los comentarios):
Básicamente, usando la tarea de test
en build.gradle
, con el método de tarea de prueba systemProperty
estableciendo una propiedad del sistema que se pasa en tiempo de ejecución:
apply plugin: ''java''
group = ''example''
version = ''0.0.1-SNAPSHOT''
repositories {
mavenCentral()
// mavenLocal()
// maven { url ''http://localhost/nexus/content/groups/public''; }
}
dependencies {
testCompile ''junit:junit:4.8.2''
compile ''ch.qos.logback:logback-classic:1.1.2''
}
test {
logger.info ''==test==''
systemProperty ''MY-VAR1'', ''VALUE-TEST''
}
Y aquí está el resto del código de muestra (que probablemente podría inferir, pero se incluye aquí de todos modos): obtiene una propiedad del sistema MY-VAR1
, que se espera que se establezca en tiempo de ejecución en VALUE-TEST
:
package example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
static final Logger log=LoggerFactory.getLogger(HelloWorld.class);
public static void main(String args[]) {
log.info("entering main...");
final String val = System.getProperty("MY-VAR1", "UNSET (MAIN)");
System.out.println("(main.out) hello, world: " + val);
log.info("main.log) MY-VAR1=" + val);
}
}
Testcase: si MY-VAR
está configurado, la prueba debería fallar:
package example;
...
public class HelloWorldTest {
static final Logger log=LoggerFactory.getLogger(HelloWorldTest.class);
@Test public void testEnv() {
HelloWorld.main(new String[]{});
final String val = System.getProperty("MY-VAR1", "UNSET (TEST)");
System.out.println("(test.out) var1=" + val);
log.info("(test.log) MY-VAR1=" + val);
assertEquals("env MY-VAR1 set.", "VALUE-TEST", val);
}
}
Ejecutar (nota: la prueba está pasando):
$ gradle cleanTest test
:cleanTest
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
BUILD SUCCESSFUL
Descubrí que la parte difícil en realidad es obtener la salida de gradle ... Entonces, el registro se configura aquí (slf4j + logback), y el archivo de registro muestra los resultados (alternativamente, ejecute gradle --info cleanTest test
; también las propiedades que llegan a la consola, pero, ya sabes, por qué):
$ cat app.log
INFO Test worker example.HelloWorld - entering main...
INFO Test worker example.HelloWorld - main.log) MY-VAR1=VALUE-TEST
INFO Test worker example.HelloWorldTest - (test.log) MY-VAR1=VALUE-TEST
Si comenta " systemProperty...
" (que, por cierto, solo funciona en una tarea de test
), entonces:
example.HelloWorldTest > testEnv FAILED
org.junit.ComparisonFailure at HelloWorldTest.java:14
Para completar, aquí está la configuración de logback ( src/test/resources/logback-test.xml
):
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>app.log</file>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d %p %t %c - %m%n</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</configuration>
Archivos:
-
build.gradle
-
src/main/java/example/HelloWorld.java
-
src/test/java/example/HelloWorldTest.java
-
src/test/resources/logback-test.xml
Estoy usando
buildTypes.each {
it.buildConfigField ''String'', ''GoogleMapsApiKey'', "/"$System.env.GoogleMapsApiKey/""
}
Se basa en share pero la toma de una variable de entorno.
Estoy usando este código y estoy trabajando muy bien.
def baseUrl = ''/"http://patelwala.com/myapi/"''
def googleServerKey = ''/"87171841097-opu71rk2ps35ibv96ud57g3ktto6ioio.apps.googleusercontent.com"''
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
buildConfigField ''String'', ''BASE_URL'', baseUrl
buildConfigField ''String'', ''web_client_id'', googleServerKey
}
releasedebug {
initWith debug
buildConfigField ''String'', ''BASE_URL'', baseUrl
buildConfigField ''String'', ''web_client_id'' ,googleServerKey
}
debug {
buildConfigField ''String'', ''BASE_URL'', baseUrl
buildConfigField ''String'', ''web_client_id'', googleServerKey
}
}
}
}
La respuesta de rciovati es totalmente correcta. Solo quería agregar un dato más para que también pueda crear variables para cada tipo de compilación dentro de la parte de configuración predeterminada de su build.gradle. Esto se vería así:
android {
defaultConfig {
buildConfigField "String", "APP_NAME", "/"APP_NAME/""
}
}
Esto le permitirá tener acceso a través de
BuildConfig.App_NAME
Solo quería tomar nota de este escenario también si desea una configuración común.
Puede crear un campo de configuración de compilación reemplazable mediante las variables de entorno del sistema durante la compilación:
El respaldo se usa durante el desarrollo, pero puede anular la variable cuando ejecuta la compilación en Jenkins u otra herramienta.
En tu aplicación build.gradle :
buildTypes {
def serverUrl = ''/"'' + (System.getenv("SERVER_URL")?: "http://default.fallback.url.com")+''/"''
debug{
buildConfigField "String", "SERVER_URL", serverUrl
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
buildConfigField "String", "SERVER_URL", serverUrl
}
}
La variable estará disponible como BuildConfig.SERVER_URL
.