我想知道如何在gradle中为特定的productFlavor和buildType添加依赖项。
例如,我有productFlavor free
和构建类型release
,如何在assembleFreeRelease
任务中添加依赖项?
我尝试了很多变种,但都没有效果。
例如我试过:
task('release', dependsOn: assembleProductionRelease) {
}
// error: Could not find property 'assembleProductionRelease' on root project 'app'.
或者:
task('release', dependsOn: 'assembleProductionRelease') {
}
这里没有错误,但是每个风味和构建类型都执行任务,非常混乱。
答案 0 :(得分:15)
对flavor和buildType依赖项有内置支持。
dependencies {
flavor1Compile "..."
freeReleaseCompile "..."
}
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Sourcesets-and-Dependencies
答案 1 :(得分:12)
这些任务是根据您的Android插件配置动态生成的。在配置时,它们尚不可用。您可以通过两种方式推迟创建任务:
afterEvaluate {
task yourTask(dependsOn: assembleFreeRelease) {
println "Your task"
}
}
Lazily declaring the task dependency as String。
task yourTask(dependsOn: 'assembleFreeRelease') {
println "Your task"
}
答案 2 :(得分:5)
现在在Android gradle插件和gradle 2.2+的版本1中看起来像你现在可以使用配置执行此操作:
configurations {
freeReleaseCompile
}
android {
...
productFlavors {
free {
...
}
}
}
dependencies {
freeReleaseCompile('myLib@aar')
}
参考:https://groups.google.com/forum/#!msg/adt-dev/E2H_rNyO6-o/h-zFJso-ncoJ
答案 3 :(得分:3)
Muschko的回答对我不起作用,所以这是我的解决方案,由我编写并发布here
定义应该只对特定的buildType / variant / flavor
执行的任务task doSomethingOnWhenBuildProductionRelease << {
//code
}
使用“&lt;&lt;”语法或者每次都会自动调用任务。
通过gradle
添加任务时动态设置依赖关系tasks.whenTaskAdded { task ->
if (task.name == 'assembleProductionRelease') {
task.dependsOn doSomethingOnWhenBuildProductionRelease
}
}
答案 4 :(得分:1)
android {
ext.addDependency = {
task, flavor, dependency ->
def taskName = task.name.toLowerCase(Locale.US)
if (taskName.indexOf(flavor.toLowerCase(Locale.US)) >= 0) {
task.dependsOn dependency
}
}
productFlavors {
production {
}
other
}
task theProductionTask << {
println('only in production')
}
tasks.withType(JavaCompile) {
compileTask -> addDependency compileTask, "production", theProductionTask
}
}
坦率地说,我没有使用哪个语言环境为编译目标生成名称,因此toLowerCase(Locale.US)
可能会适得其反。
答案 5 :(得分:0)
这是我使用的另一种方式:
tasks.withType(JavaCompile) {
compileTask ->
def dependedTaskName = "dependedTask_";
if(compileTask.name.contains('Release') {
dependedTaskName += "Release";
}
createTask(dependedTaskName, Exec) {
........
}
compileTask.dependsOn ndkBuildTaskName
}
另一种方式:
tasks.whenTaskAdded { task ->
if (task.name == 'generateReleaseBuildTypeBuildConfig') {
task.dependsOn doSomethingForReleaseBuild
}
}
第一种方法是动态的,而第二种方法更简单。
答案 6 :(得分:0)
以上所有答案对我都有帮助,但我最终需要在编译每种风格的调试 + 发布版本之前运行脚本。脚本的第一个参数采用风味名称。
为了尽早触发此触发器,但在创建特定于风味的任务之后,关键是将 dependsOn 绑定到 generateMyflavorDebugBuildConfig。
这是我最终得到的脚本,可以放在 app/build.gradle 的底部
// When a task is active, loop through all app flavors, and see if the
// task.name matches the earliest task we can set up the dependsOn
// loop through all flavors, and create a task that does the work we want to do
// before anything else
android.productFlavors.all { flavor ->
task("${flavor.name}RunCommandBefore", type: Exec) {
workingDir "$projectDir/../.."
commandLine 'sh', 'scripts/run_thing.sh', "${flavor.name}"
}
}
// when tasks created, loop through and as early as we can, bind the
// RunCommandBefore task we created above
tasks.whenTaskAdded { task ->
def taskName = task.name
// loop through all flavors
android.productFlavors.all { flavor ->
def flavorName = flavor.name
// loop through release types so that this happens for debug and release
['debug', 'release'].each { releaseType ->
// generateMyflavorDebugBuildConfig is the earliest task we're able
// to set up the dependsOn to make sure that our script runs
if (taskName.toLowerCase() == "generate${flavorName.toLowerCase()}${releaseType}buildconfig") {
// now myflavorRunCommandBefore will run before
// generateMyflavorDebugBuildConfig
tasks."$taskName".dependsOn "${flavorName}RunCommandBefore"
}
}
}
}
希望这对某人有所帮助!令人惊讶的是,Android 使运行简单脚本的第一件事变得如此困难..