如何在 Android Gradle 配置中获取当前的 buildType
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25739163/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get current buildType in Android Gradle configuration
提问by Arthur Dent
I want to dynamically add a dependency in an Android Gradle project based on the current buildType. I know I can specify the buildType in the dependency:
我想根据当前的 buildType 在 Android Gradle 项目中动态添加依赖项。我知道我可以在依赖项中指定 buildType:
compile project(path: ':lib1', configuration: 'debug')
But how can I use the current buildType to specify which variant of the library I want to import, so that a debug or release build automatically imports the debug or release variant of the library? What I want is something like this (where currentBuildType is a variable containing the name of the currently used buildType):
但是如何使用当前的 buildType 来指定我要导入的库的哪个变体,以便调试或发布版本自动导入库的调试或发布变体?我想要的是这样的(其中 currentBuildType 是一个包含当前使用的 buildType 名称的变量):
compile project(path: ':lib1', configuration: currentBuildType)
The library project I want to import has set publishNonDefault true
, so all buildTypes are published.
我要导入的库项目已设置publishNonDefault true
,因此所有 buildType 均已发布。
采纳答案by Arthur Dent
I could not find a clean way to get the current build type during the configuration phase of Gradle. Instead I define the dependency for each build type separately like that:
在 Gradle 的配置阶段,我找不到一种干净的方法来获取当前的构建类型。相反,我分别为每个构建类型定义了依赖关系,如下所示:
debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')
If you have many build types and many project dependencies this can get very verbose, but it is possible to add a function to make the dependency a one-liner. You need to add this to your main Gradle build file:
如果您有许多构建类型和许多项目依赖项,这可能会变得非常冗长,但是可以添加一个函数使依赖项成为单行依赖项。您需要将其添加到您的主要 Gradle 构建文件中:
subprojects {
android {
dependencies.metaClass.allCompile { dependency ->
buildTypes.each { buildType ->
"${buildType.name}Compile" project(path: ":${dependency.name}", configuration: buildType.name)
}
}
}
}
Then you can add project dependencies in your Gradle modules like this:
然后你可以像这样在你的 Gradle 模块中添加项目依赖项:
allCompile project(':lib1')
If you also use build flavors you would have to adapt the solution. See this link for a documentation of the feature: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication
如果您还使用构建风格,则必须调整解决方案。有关该功能的文档,请参阅此链接:http: //tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication
Please note that the Android team is working on an improvement for this behaviour: https://code.google.com/p/android/issues/detail?id=52962
请注意,Android 团队正在改进此行为:https: //code.google.com/p/android/issues/detail?id=52962
回答by Alexander Blinov
Add a task which depends on each assembleXxx task and property setting up after it invoked
添加一个任务,它依赖于每个 assembleXxx 任务和它调用后的属性设置
ext {
currentConfig = ""
}
task generateConfigProperty(dependsOn: 'installDebug') {
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def taskName = "taskindicate$output.name"
task "$taskName"() << {
project.ext.set("currentConfig", "$output.name")
}
output.assemble.dependsOn "taskindicate$output.name"
}
}
}
task getConfig(dependsOn: ['installDebug', 'generateConfigProperty']) << {
println("My config is $currentConfig")
}
took idea from the answer
回答by Shooky
You can use
您可以使用
if(gradle.startParameter.taskNames.contains("assembleExample")) {
// do stuff
}
if(gradle.startParameter.taskNames.contains("assembleExample")) {
// do stuff
}
That variable will be set before the buildConfig
block is evaluated
该变量将在buildConfig
评估块之前设置
回答by Reinherd
This one is quite simple:
这个很简单:
android {
applicationVariants.all { variant ->
variant.buildType.name // this is the value!
}
}
Edit: Apparently at some point with gradle update, this is not working as I mentioned in a comment below. So I'd recommend checking other options.
编辑:显然在某些时候使用 gradle 更新,这不起作用,正如我在下面的评论中提到的那样。所以我建议检查其他选项。
回答by what
// declare a custom task class so you can reuse it for the different
// variants
class MyTask extends DefaultTask {
String mVariantName;
public void setVariantName(String variant) {mVariantName = variant;}
public String getVariantName() { return mVariantName; }
@TaskAction
void action(){
// do stuff
}
}
// put this after your `android{}` block.
android.applicationVariants.all { variant ->
def taskName = "myTask_$variant.name"
task "$taskName"(type: MyTask) << {
// you can setup this task to various info regarding
// variant
variantName = variant.name
}
variant.assemble.dependsOn (taskName)
}
See Advance customizationfor more details of what you can extract from the variant
variable.
有关可以从变量中提取的内容的更多详细信息,请参阅高级定制variant
。
now you it will properly hookup your MyTask
into to the chain. Doing it this way should also cleanly handle building multiple flavors all at once as it creates a new instance of MyTask for each variant.
现在您将正确地将您连接MyTask
到链中。以这种方式执行此操作还应该可以同时干净地处理构建多种风格,因为它会为每个变体创建一个新的 MyTask 实例。
回答by Codeversed
This is the easiest way to get the result you want. You define the global variable, then updated it for use later where ever needed.
这是获得所需结果的最简单方法。您定义全局变量,然后更新它以供以后需要时使用。
// query git for the SHA, Tag and commit count. Use these to automate versioning.
def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
//def gitTag = 'git describe --tags'.execute([], project.rootDir).text.trim()
def gitCommitCount = 100 +
Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"))
def versionMajor = 1
def versionMinor = 5
def versionPatch = 2
def versionBuild = 0 // bump for dogfood builds, public betas, etc.
def buildType // define here to update in loop
android {
applicationVariants.all { variant ->
buildType = variant.buildType.name // sets the current build type
}
defaultConfig {
applicationId "com.example"
minSdkVersion 19
targetSdkVersion 25
vectorDrawables.useSupportLibrary = true
versionCode gitCommitCount
versionName "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}"
versionNameSuffix "-${buildType}-build-${buildTime}"
}
回答by Braian Coronel
build.gradle
构建.gradle
android {
...
def buildType
buildTypes {
debug {
buildConfigField("String", "MY_BUILD_TYPE", "\"debug\"")
buildType = getBuildConfigFields().get("MY_BUILD_TYPE").getValue()
}
}
}
GL
GL