I know how to create a buildConfigField variable and set its value in my build.gradle file. E.g. buildConfigField 'String', 'BUILD_VALUE', 'HELLO WORLD'.
I also know how to pass in an argument from gradle command line via task. For instance, if I do ./gradleW propertyTypes -Dargs=test1 -Pargs=test2 in terminal and have the following in my build.gradle:
task propertyTypes(){
doLast{
if (project.hasProperty("args")) {
println "Project property [" project.getProperty("args") "]"
}
println "System property [" System.getProperty("args") "]"
}
}
it will output test2 and test1 to terminal.
However, I don't know how to put them together. I want to be able to pass in an argument (e.g. "Hello World") via the gradle commandline and then have that set as a buildConfigField for use in the program itself. When I try though, either task doesn't know what a buildConfigField is or the buildConfigField doesn't know the properties passed into the task.
Any insight on how I can make this work?
CodePudding user response:
This answer worked for me:
https://stackoverflow.com/a/65150777/5026136
To paraphrase:
Step 1: Create a variable to hold the default value in the gradle.properties file
MY_VAR=defaultValue
Step 2: Create a buildConfigField variable called [VAR_NAME] in the app's build.gradle file inside the android->defaultconfig block. For its value, give it the variable you put in gradle.properties using the syntax below:
android {
defaultConfig {
buildConfigField "String", "VAR_NAME", "\"$MY_VAR\""
}
Step 3: Rebuild the project. (Until you do, you won't be able to access the new BuildConfig variable in your code.)
Step 4: Use the BuildConfig.VAR_NAME variable in your app's code as desired.
Step 5: Pass a new value for the variable via command line by adding the following flag to your gradlew command line:
-P MY_VAR=new_value
where new_value is whatever you decide and MY_VAR is the name you put in your gradle.properties file.
As an added bonus, you can check that you are indeed able to pass in a value via command line and have it update correctly by adding the following to your app's build.gradle (just prior to the android block):
task output { println "\"$MY_VAR\"" }
(Note that "output" is just a name for the task --- you can call it anything)
Then if you run ./gradleW output in terminal, it will print the default value for MY_VAR as you've set it in gradle.properties.
If instead you run ./gradleW output -P MY_VAR=new_val then it will print the updated value!
