É possível declarar uma variável no Gradle utilizável em Java? Basicamente, eu gostaria de declarar alguns vars no build.gradle e obtê-lo (obviamente) no momento da compilação. Assim como as macros de pré-processador em C / C ++ ...
Um exemplo de declaração seria algo assim ...:
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
Existe uma maneira de fazer algo assim?
java
android
gradle
android-gradle-plugin
Klefevre
fonte
fonte
<project>/src/
, se você criar o arquivodebug/res/values/strings.xml
e outro arquivorelease/res/values/strings.xml
, poderá definir recursos para a depuração e liberar compilações de uma maneira um pouco mais limpa.android
plugin? ou seja, apenas usandoapply plugin java
? obrigado!Um exemplo de uso de uma Api App Key em um aplicativo Android (Java e XML)
gradle.properties
build.gradle
Uso no código java
Uso no código xml
fonte
./gradlew -PAppKey="1234" testdebug
defaultConfig
bloco assim: stackoverflow.com/a/51521146/321354@string/APP_KEY_2
Exemplo usando propriedades do sistema, configurada em build.gradle, lida no aplicativo Java (acompanhando a pergunta nos comentários):
Basicamente, usando a
test
tarefa inbuild.gradle
, com o método de tarefa de testesystemProperty
configurando uma propriedade do sistema que é passada no tempo de execução:E aqui está o restante do código de amostra (que você provavelmente poderia inferir, mas está incluído aqui de qualquer maneira): ele obtém uma propriedade do sistema
MY-VAR1
, que em tempo de execução deve ser definida comoVALUE-TEST
:Caso de teste: se
MY-VAR
não estiver definido , o teste deverá falhar:Execução (nota: o teste está passando):
Eu descobri que a parte mais complicada é realmente obter a saída do gradle ... Então, o log é configurado aqui (slf4j + logback), e o arquivo de log mostra os resultados (como alternativa, execute
gradle --info cleanTest test
; também existem propriedades que são desatualizadas). o console, mas, você sabe o porquê):Se você comentar "
systemProperty...
" (que, aliás, funciona apenas em umatest
tarefa), então:Para completar, aqui está o logback config (
src/test/resources/logback-test.xml
):Arquivos:
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
fonte
version = '0.0.1-SNAPSHOT'
via código Java?systemProperty
realmente só faz sentido para os testes, então vejo por que eles fizeram dessa maneira (não é uma supervisão), mas, ao mesmo tempo, também tentei usar o gradle para coisas para as quais não se destinava (como um aplicativo DSL ) para que eu possa identificar. Como alternativa, eu recomendaria apenas carregar propriedades de um arquivo de propriedades (ou serviço de configuração, etc.), porque se não estiver no modo "teste", será no modo "produção" e requer lógica de aplicativo. (Essa é a teoria, de qualquer maneira.)Você pode criar um campo de configuração de configuração substituível por meio de variáveis de ambiente do sistema durante a construção:
O fallback é usado durante o desenvolvimento, mas você pode substituir a variável ao executar a construção no Jenkins ou em outra ferramenta.
No seu aplicativo build.gradle :
A variável estará disponível como
BuildConfig.SERVER_URL
.fonte
A resposta de rciovati está totalmente correta. Eu só queria adicionar mais um petisco, para que você também possa criar variáveis para cada tipo de compilação na parte de configuração padrão do seu build.gradle. Isso ficaria assim:
Isso permitirá que você tenha acesso a
Só queria anotar esse cenário também se você quiser uma configuração comum.
fonte
Estou usando esse código e funcionando muito bem.
}
fonte
Como você pode inserir o resultado da função String em buildConfigField
Aqui está um exemplo de data de compilação no conjunto de formatos legíveis por humanos:
fonte
estou a usar
É baseado na resposta de Dennis, mas a captura de uma variável de ambiente.
fonte
Nenhuma das respostas acima me deu orientações, então tive que passar duas horas aprendendo sobre os Métodos Groovy.
Eu queria ir contra uma produção, sandbox e ambiente local. Por ser preguiçoso, só queria alterar o URL em um só lugar. Aqui está o que eu vim com:
Sintaxe alternativa, porque você só pode usar
${variable}
com aspas duplas nos Métodos Groovy.O que foi difícil de entender foi que as strings precisam ser declaradas como strings entre aspas. Por causa dessa restrição, não pude usar a referência
API_HOST
diretamente, o que eu queria fazer em primeiro lugar.fonte