Apakah mungkin untuk mendeklarasikan variabel dalam Gradle yang dapat digunakan di Jawa? Pada dasarnya saya ingin mendeklarasikan beberapa vars di build.gradle dan kemudian mendapatkannya (jelas) pada waktu build. Sama seperti makro pra-prosesor di C / C ++ ...
Contoh deklarasi akan seperti itu ...:
android {
debug {
A_VAR_RETRIEVABLE_IN_JAVA = 42
}
release {
A_VAR_RETRIEVABLE_IN_JAVA = 42+52
}
}
Apakah ada cara untuk melakukan hal seperti itu?
java
android
gradle
android-gradle-plugin
klefevre
sumber
sumber
<project>/src/
, jika Anda membuat filedebug/res/values/strings.xml
dan file lainrelease/res/values/strings.xml
, Anda bisa mengatur sumber daya untuk debug dan rilis build dengan cara yang sedikit lebih bersih juga.android
plugin? yaitu hanya menggunakanapply plugin java
? Terima kasih!Contoh penggunaan Kunci Aplikasi Api di aplikasi Android (Java dan XML)
properti
build.gradle
Penggunaan dalam kode java
Penggunaan dalam kode xml
sumber
./gradlew -PAppKey="1234" testdebug
defaultConfig
blok juga: stackoverflow.com/a/51521146/321354@string/APP_KEY_2
Contoh menggunakan properti sistem, ditetapkan dalam build.gradle, baca dari aplikasi Java (menindaklanjuti pertanyaan di komentar):
Pada dasarnya, menggunakan
test
tugas dalambuild.gradle
, dengan metode tugas ujisystemProperty
menetapkan properti sistem yang dilewati saat runtime:Dan inilah sisa kode sampel (yang mungkin dapat Anda simpulkan, tetapi sudah termasuk di sini): kode ini mendapatkan properti sistem
MY-VAR1
, yang diharapkan pada saat run-time diatur keVALUE-TEST
:Testcase: jika
MY-VAR
tidak disetel, tes harus gagal:Jalankan (catatan: tes lulus):
Saya telah menemukan bahwa bagian yang rumit sebenarnya mendapatkan output dari gradle ... Jadi, logging dikonfigurasi di sini (slf4j + logback), dan file log menunjukkan hasilnya (sebagai alternatif, jalankan
gradle --info cleanTest test
; ada juga properti yang mendapatkan stdout untuk konsol, tetapi, Anda tahu, mengapa):Jika Anda berkomentar "
systemProperty...
" (yang, btw, hanya berfungsi dalamtest
tugas), maka:Untuk kelengkapan, berikut adalah konfigurasi logback (
src/test/resources/logback-test.xml
):File:
build.gradle
src/main/java/example/HelloWorld.java
src/test/java/example/HelloWorldTest.java
src/test/resources/logback-test.xml
sumber
version = '0.0.1-SNAPSHOT'
melalui kode Java?systemProperty
benar-benar hanya masuk akal untuk pengujian, jadi saya melihat mengapa mereka melakukannya dengan cara ini (ini bukan pengawasan), tetapi pada saat yang sama, saya juga mencoba menggunakan gradle untuk hal-hal yang tidak dimaksudkan untuknya (seperti aplikasi DSL ) jadi saya bisa mengidentifikasi. Sebagai alternatif, saya sarankan hanya memuat properti dari file properti (atau layanan konfigurasi, dll), karena jika tidak dalam mode "test", maka itu mode "produksi" & memerlukan logika aplikasi. (Begitulah teorinya.)Anda dapat membuat bidang konfigurasi build yang dapat ditimpa melalui variabel lingkungan sistem selama proses:
Fallback digunakan saat mengembangkan, tetapi Anda bisa mengganti variabel ketika Anda menjalankan build di Jenkins atau alat lain.
Di build.gradle aplikasi Anda :
Variabel akan tersedia sebagai
BuildConfig.SERVER_URL
.sumber
Jawaban rciovati sepenuhnya benar. Saya hanya ingin menambahkan satu berita menarik bahwa Anda juga dapat membuat variabel untuk setiap tipe build di dalam bagian konfigurasi default build.gradle Anda. Ini akan terlihat seperti ini:
Ini akan memungkinkan Anda untuk memiliki akses melalui
Hanya ingin mencatat skenario ini juga jika Anda menginginkan konfigurasi umum.
sumber
Saya menggunakan kode ini dan bekerja dengan sangat baik.
}
sumber
Bagaimana Anda bisa menyisipkan hasil String fungsi ke buildConfigField
Berikut adalah contoh tanggal pembuatan dalam rangkaian format yang dapat dibaca manusia:
sumber
saya menggunakan
Ini didasarkan pada jawaban Dennis tetapi mengambilnya dari variabel lingkungan.
sumber
Tidak satu pun dari jawaban di atas yang memberi saya pedoman, jadi saya harus menghabiskan dua jam belajar tentang Metode Groovy.
Saya ingin dapat menentang produksi, kotak pasir, dan lingkungan setempat. Karena saya malas, saya hanya ingin mengubah URL di satu tempat. Inilah yang saya pikirkan:
Sintaks alternatif, karena Anda hanya dapat menggunakan
${variable}
dengan tanda kutip ganda dalam Metode Groovy.Yang sulit saya pahami adalah bahwa string harus dinyatakan sebagai string yang dikelilingi oleh tanda kutip. Karena pembatasan itu, saya tidak dapat menggunakan referensi
API_HOST
secara langsung, yang ingin saya lakukan sejak awal.sumber