我想知道根项目是否有办法在其依赖项中定义/注入一些属性。更具体地说,我遇到的问题是库项目必须知道在运行汇编/编译任务之前是否采用“自由”或“专业”java源和其他资源。有点像为库项目指定产品风格(从它的父项目继承),但Gradle的Android插件不支持。改变库项目结构,即创建“免费”和“专业”库不是一种选择。
修改 到目前为止,我所能达到的最好成绩是这样的:
root: build.gradle
android {
...
productFlavors {
free, pro
}
sourceSets {
free {
project(':..:lib') {
groupFreePro = 'free'
// java.srcDirs = ['src', 'free/src']
}
}
pro {
project(':..:lib') {
groupFreePro = 'pro'
// java.srcDirs = ['src', 'pro/src']
}
}
...
}
}
library: gradle.build
android {
...
sourceSets {
main {
java.srcDirs = [groupFreePro + '/src']
res.srcDirs = [groupFreePro + '/res']
}
}
...
}
}
这样我将groupFreePro变量注入lib项目。但这种方法存在问题:
到时候,当lib项目得到它的android - > sourceSets任务groupFreePro始终设置为“pro”。我认为这是因为根项目中的所有sourceSets都被读取(而不仅仅是我想要构建的一个变体;例如“free”)因此最后一个set / task总是覆盖任何先前设置的groupFreePro值。 / p>
如果我尝试以任何其他方式设置groupFreePro的值,它会被覆盖(如上例所示),或者我不知道应该调用此变量注入东西设置的适当任务/时间/地点变量到期望值。在根项目中取消注释java.srcDirs
也无济于事。
我尝试自己解决这些问题,但我对Gradle很新,而且缺乏适当的文档(至少对于Android部分而言)让我猜测大部分时间都要做什么,所以我做了很多反复试验(但现在我有点困惑)。
答案 0 :(得分:6)
这就是我现在解决问题的方法。这不是一个完美的解决方案,但现在已经足够好了。
我已经更新了答案,包括最新的0.9.2 Gradle插件及其新的(est)功能(大多只更新了库构建脚本)。
root: gradle.build
// global variables
ext {
// can be set to default values or blank
groupFreePro = "free"
}
// start parameters
println "Start parametes: tasks = " + gradle.startParameter.getTaskNames()
gradle.startParameter.getTaskNames().each { task ->
if (task.contains("Free") || task.contains("F")) {
groupFreePro = "free"
} else if (task.contains("Pro") || task.contains("P")) {
groupFreePro = "pro"
}
println "groupFreePro = " + groupFreePro
}
android {
...
}
task.contains("F")
用于处理缩写版本或运行任务(如果我们想将脚本作为gradle aFD
运行)。
ext
下的全局变量可以设置为默认值。在这种情况下,即使您在任务名称中运行没有“Free / Pro”的脚本,它也应该可以正常工作。默认值的缺点是,如果未正确设置,构建可能不会崩溃(如果您希望构建仅在指定任务名称中的“Free / Pro”时工作)。
library: gradle.build
android {
...
defaultPublishConfig groupFreePro + groupDebugRelease.capitalize()
productFlavors {
free
pro
}
...
sourceSets {
main {
java.srcDirs = ['/src']
res.srcDirs = ['/res']
}
free {
java.srcDirs = ["free/src"]
res.srcDirs = ["free/res"]
}
pro {
java.srcDirs = ["pro/src"]
res.srcDirs = ["pro/res"]
}
}
...
}
dependencies {
freeCompile fileTree(dir: 'free/lib', include: '*.jar')
}
defaultPublishConfig
,因此我无需指定
java.srcDirs = ["src", groupFreePro + "/src"]
res.srcDirs = [groupFreePro + "/res"]
以及现在使用自定义风味编译,即flavor1Compile
(在dependencies
块中)。
在compile project(path: ':project', configuration: 'flavor1Debug')
块中编写dependencies
的选项对我们不起作用,因为你必须通过依赖关系传递这些选项,如果你有多个风味组/维度,这意味着更多或所有的风味组合都必须在“非最后”的依赖关系中处理(即具有其他依赖关系(具有多种风格)的依赖关系)。
println
行只是为了查看并确保传递正确的参数。
此解决方案的优势(与Varun相比)是您只需运行一个(原始)任务。这也意味着它可以(或者至少它应该)与Android Studio一起工作而没有任何问题。
此解决方案的缺点是,如果您想使用缺少gradle assemble
部分的Free
命令(或类似命令)构建所有变体,则它不起作用任务。我想这也可以处理,但我不这样做,因为目前的解决方案对我来说已经足够好了(尽管如果我改进了当前的解决方案,我也可能会更新这个答案)。
使用gradle.taskGraph.whenReady
可能还有其他解决方案,但我不知道如何正确设置srcDirs
(尤其是依赖关系)。建议欢迎。
答案 1 :(得分:3)
Here是LibraryVariant
而here是ApkVariant
查看上面的DSL
,productFlavors
类型不支持多个LibraryVariant
..
如果您的free/pro
不会发生太大变化,您可以为专业版和免费版创建aar
,并根据您的应用需要将其用作依赖项。
更新:
我在github上有一些代码。它可以工作,但需要在应用程序上调用实际的构建/汇编任务之前调用一个额外的任务。 https://github.com/varunkochar/Trying-Android-Gradle/tree/master/FakeLibraryProductFlavors
<强>更新强>
使用最新的android gradle插件v0.9.0,现在是LibraryProject 还支持与ApplicationProject相同的DSL。所以,你可以使用 最新版本并使用库项目的内置功能 使用自定义口味构建。 资料来源:http://tools.android.com/tech-docs/new-build-system
答案 2 :(得分:3)
此功能现在可在Android版Gradle插件0.9版之后使用。
看看这里:http://tools.android.com/tech-docs/new-build-system/migrating_to_09
在这里复制粘贴:
的库强> 的
图书馆项目的DSL现在与应用项目相同。这意味着您可以创建更多构建类型,并创建风格 - 您可以在buildTypes {...}容器中创建/配置更多构建类型 - 您可以使用productFlavors {...}容器创建产品口味 - 您可以使用signingConfigs {...}容器创建signingConfigs。
例如,如果您的库中有:
android {
debug {
}
release {
}
debugSigningConfig {
}
}
您可以将其替换为:
android {
buildTypes {
debug {
}
release {
}
}
signingConfigs {
debug {
}
}
}
答案 3 :(得分:0)
现在可以在android studio 0.5中使用产品风味(需要gradle插件0.9)
所以你现在可以有效地编写这个DSL:
android {
buildTypes {
debug {
}
release {
}
}
signingConfigs {
debug {
}
}
}
请参阅:http://tools.android.com/tech-docs/new-build-system/migrating_to_09 并http://tools.android.com/recent/androidstudio050released