如何在 kotlin 代码中获取在 'gradle.properties 中定义的自定义 属性?
How do I get a custom property defined in 'gradle.properties in kotlin code?
我在 gradle.properties
中添加了自定义 属性 :
libraryVersion=0.1.0-beta
如何在我发布的代码中阅读它?我想在我的 Kotlin 库中使用这个值而不对其进行硬编码。
如果您想使用 gradle 中的 属性,您可以这样做
里面app/build.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
}
/******************/
def properties = new Properties()
try {
properties.load(new FileInputStream(rootProject.file("gradle.properties")))
} catch (Exception e) {
logger.warn("Properties not Found!")
}
/******************/
android {
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.test.myapplication"
minSdkVersion 21
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
/********/
buildConfigField("String", "LIBRARY_VERSION", "\"" + properties['libraryVersion'] + "\"")
/*********/
}
}
您可以从 BuildConfig 中获取此值
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("TAG", BuildConfig.LIBRARY_VERSION)
}
}
您可以访问 gradle.properties
中定义的系统属性。他们应该有 systemProp.
前缀。然后在 gradle 构建文件中,你应该在程序中传递它。
这里是打印 gradle.properties
中定义的 属性 的控制台应用程序示例。
文件gradle.properties
:
systemProp.libraryVersion=0.1.0-beta
文件Main.kt
:
fun main(args: Array<String>) {
val libraryVersion = System.getProperty("libraryVersion") ?: ""
println(libraryVersion)
}
文件build.gradle.kts
:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.5.10"
application
}
group = "me.yunir"
version = "0.1"
repositories {
mavenCentral()
}
dependencies {
testImplementation(kotlin("test"))
}
tasks.test {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
application {
mainClass.set("MainKt")
// applicationDefaultJvmArgs = listOf( // 1
// "-DlibraryVersion=${System.getProperty("libraryVersion")}"
// )
}
tasks.named<JavaExec>("run") { // 2
systemProperty("libraryVersion", System.getProperty("libraryVersion"))
}
有 2 个变体通过系统 属性 进行编程:
- 使用特定于“应用程序”的插件 属性
applicationDefaultJvmArgs
- 对特定任务使用
systemProperty
方法
程序的输出:
0.1.0-beta
附加链接:
- https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_system_properties
- https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
更新。 1
或者如果您不想使用前缀 systemProp.
并使用 gradle 项目属性,那么第二个变体将如下所示:
文件gradle.properties
:
libraryVersion=0.1.0-beta
文件build.gradle.kts
:
...
tasks.named<JavaExec>("run") { // 2
systemProperty("libraryVersion", findProperty("libraryVersion") ?: "")
}
...
经过一段时间的挖掘,我找到了我要找的答案
解决方法如下:
build.gradle.kts:
import java.io.FileOutputStream
import java.util.Properties
version = "1.0.0"
val generatedVersionDir = "$buildDir/generated-version"
sourceSets {
main {
kotlin {
output.dir(generatedVersionDir)
}
}
}
tasks.register("generateVersionProperties") {
doLast {
val propertiesFile = file("$generatedVersionDir/version.properties")
propertiesFile.parentFile.mkdirs()
val properties = Properties()
properties.setProperty("version", "$version")
val out = FileOutputStream(propertiesFile)
properties.store(out, null)
}
}
tasks.named("processResources") {
dependsOn("generateVersionProperties")
}
Library.kts:
private val versionProperties = Properties()
val version: String
get() {
return versionProperties.getProperty("version") ?: "unknown"
}
init {
val versionPropertiesFile = this.javaClass.getResourceAsStream("/version.properties")
versionProperties.load(versionPropertiesFile)
}
我在 gradle.properties
中添加了自定义 属性 :
libraryVersion=0.1.0-beta
如何在我发布的代码中阅读它?我想在我的 Kotlin 库中使用这个值而不对其进行硬编码。
如果您想使用 gradle 中的 属性,您可以这样做
里面app/build.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
}
/******************/
def properties = new Properties()
try {
properties.load(new FileInputStream(rootProject.file("gradle.properties")))
} catch (Exception e) {
logger.warn("Properties not Found!")
}
/******************/
android {
compileSdkVersion 31
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.test.myapplication"
minSdkVersion 21
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
/********/
buildConfigField("String", "LIBRARY_VERSION", "\"" + properties['libraryVersion'] + "\"")
/*********/
}
}
您可以从 BuildConfig 中获取此值
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Log.d("TAG", BuildConfig.LIBRARY_VERSION)
}
}
您可以访问 gradle.properties
中定义的系统属性。他们应该有 systemProp.
前缀。然后在 gradle 构建文件中,你应该在程序中传递它。
这里是打印 gradle.properties
中定义的 属性 的控制台应用程序示例。
文件gradle.properties
:
systemProp.libraryVersion=0.1.0-beta
文件Main.kt
:
fun main(args: Array<String>) {
val libraryVersion = System.getProperty("libraryVersion") ?: ""
println(libraryVersion)
}
文件build.gradle.kts
:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.5.10"
application
}
group = "me.yunir"
version = "0.1"
repositories {
mavenCentral()
}
dependencies {
testImplementation(kotlin("test"))
}
tasks.test {
useJUnitPlatform()
}
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
application {
mainClass.set("MainKt")
// applicationDefaultJvmArgs = listOf( // 1
// "-DlibraryVersion=${System.getProperty("libraryVersion")}"
// )
}
tasks.named<JavaExec>("run") { // 2
systemProperty("libraryVersion", System.getProperty("libraryVersion"))
}
有 2 个变体通过系统 属性 进行编程:
- 使用特定于“应用程序”的插件 属性
applicationDefaultJvmArgs
- 对特定任务使用
systemProperty
方法
程序的输出:
0.1.0-beta
附加链接:
- https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_system_properties
- https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
更新。 1
或者如果您不想使用前缀 systemProp.
并使用 gradle 项目属性,那么第二个变体将如下所示:
文件gradle.properties
:
libraryVersion=0.1.0-beta
文件build.gradle.kts
:
...
tasks.named<JavaExec>("run") { // 2
systemProperty("libraryVersion", findProperty("libraryVersion") ?: "")
}
...
经过一段时间的挖掘,我找到了我要找的答案
解决方法如下:
build.gradle.kts:
import java.io.FileOutputStream
import java.util.Properties
version = "1.0.0"
val generatedVersionDir = "$buildDir/generated-version"
sourceSets {
main {
kotlin {
output.dir(generatedVersionDir)
}
}
}
tasks.register("generateVersionProperties") {
doLast {
val propertiesFile = file("$generatedVersionDir/version.properties")
propertiesFile.parentFile.mkdirs()
val properties = Properties()
properties.setProperty("version", "$version")
val out = FileOutputStream(propertiesFile)
properties.store(out, null)
}
}
tasks.named("processResources") {
dependsOn("generateVersionProperties")
}
Library.kts:
private val versionProperties = Properties()
val version: String
get() {
return versionProperties.getProperty("version") ?: "unknown"
}
init {
val versionPropertiesFile = this.javaClass.getResourceAsStream("/version.properties")
versionProperties.load(versionPropertiesFile)
}