feat: add manifest placeholders support in AndroidGenerateConfig

This commit is contained in:
2025-11-16 00:10:36 +08:00
parent 8d16f24098
commit c4e78707d6
5 changed files with 44 additions and 5 deletions

View File

@@ -126,6 +126,8 @@ internal object DefaultConfig {
override val isIsolationEnabled get() = true
override val manifestPlaceholders get() = false
override val isEnabled
get() = selfCommon?.isEnabled
?: globalCommon?.isEnabled

View File

@@ -186,6 +186,11 @@ private fun GropifyConfigureExtension.AndroidGenerateConfigureScope.create(
?: global?.isIsolationEnabled
?: DefaultConfig.createAndroidGenerateConfig(name, selfCommon, globalCommon).isIsolationEnabled
override val manifestPlaceholders
get() = this@create.manifestPlaceholders
?: global?.manifestPlaceholders
?: DefaultConfig.createAndroidGenerateConfig(name, selfCommon, globalCommon).manifestPlaceholders
override val existsPropertyFiles
get() = this@create.existsPropertyFiles
?: global?.existsPropertyFiles

View File

@@ -85,7 +85,11 @@ internal interface GropifyConfig {
/**
* Android project generate configuration interface.
*/
interface AndroidGenerateConfig : JvmGenerateConfig
interface AndroidGenerateConfig : JvmGenerateConfig {
/** Whether to use manifest placeholders' generation. */
val manifestPlaceholders: Boolean
}
/**
* Jvm project generate configuration interface.

View File

@@ -91,7 +91,7 @@ internal class SourceCodeDeployer(private val _config: () -> GropifyConfig) : De
val properties = generateMap(config, ProjectDescriptor.create(project = this))
if (!configModified && properties == cachedProjectProperties[getFullName()] && !outputDir.isEmpty()) {
if (config.isEnabled) configureSourceSets(project = this)
if (config.isEnabled) configureSourceSets(project = this, properties)
return
}
@@ -110,7 +110,7 @@ internal class SourceCodeDeployer(private val _config: () -> GropifyConfig) : De
sourceCodeGenerator.build(projectType, config, generateConfig, properties).let { generator ->
generator.first { it.type == sourceCodeType }
}.writeTo(outputDir)
configureSourceSets(project = this)
configureSourceSets(project = this, properties)
}
rootProject.generate()
@@ -121,7 +121,7 @@ internal class SourceCodeDeployer(private val _config: () -> GropifyConfig) : De
}
}
private fun configureSourceSets(project: Project) {
private fun configureSourceSets(project: Project, properties: PropertyMap) {
val projectType = project.resolveType()
val config = config.from(project).let {
@@ -189,6 +189,24 @@ internal class SourceCodeDeployer(private val _config: () -> GropifyConfig) : De
"Project '${project.getFullName()}' source sets deployed failed, method \"srcDir\" maybe failed during the processing."
)
} else Logger.debug("Source directory \"$generateDirPath\" already added to source set \"${config.sourceSetName}\", skipping.")
if (projectType == ProjectType.Android &&
config is GropifyConfig.AndroidGenerateConfig &&
config.manifestPlaceholders
) {
Logger.debug("Deploying to manifestPlaceholders.")
val defaultConfig = extension.asResolver().optional(!debugMode).firstMethodOrNull {
name = "getDefaultConfig"
emptyParameters()
}?.invokeQuietly()
defaultConfig?.asResolver()?.optional(!debugMode)?.firstMethodOrNull {
name = "addManifestPlaceholders"
parameters(Map::class)
superclass()
}?.invokeQuietly(properties.map { (key, value) -> key to value.raw }.toMap())
}
}
private fun decideSourceCodeType(config: GropifyConfig.CommonCodeGenerateConfig, type: ProjectType) = when (type) {

View File

@@ -173,7 +173,17 @@ open class GropifyConfigureExtension internal constructor() {
@JvmName("extensionName") set
}
open inner class AndroidGenerateConfigureScope internal constructor() : JvmGenerateConfigureScope()
open inner class AndroidGenerateConfigureScope internal constructor() : JvmGenerateConfigureScope() {
/**
* Whether to use manifest placeholders' generation.
*
* Disabled by default, when enabled will synchronize the properties' key-values
* to the `manifestPlaceholders` in the `android` configuration method block.
*/
var manifestPlaceholders: Boolean? = null
@JvmName("manifestPlaceholders") set
}
open inner class JvmGenerateConfigureScope internal constructor() : CommonCodeGenerateConfigureScope() {