编辑风味和路径:
目前我有:
sourceSets.whenObjectAdded {
sourceSet ->
def sourceData = rootProject.ext[sourceSet.name]
sourceSet.java.srcDirs = sourceData.javaDirRelease
}
rootProject.ext是一个文件,其中所有productFlavor特定配置都是这样定义的:
ext{
flavor1 = [
javaDirRelease : ['src/pathToJavaReleaseFiles']
javaDirDebug : ['src/pathToJavaDebugFiles']
]
}
在main build.gradle中,我也这样做:apply from: 'variants.gradle'
,其中包含上面的\ text {}对象。
sourceSets定义如下:
sourceSets {
flavor1{}
}
这有效,但我想添加一个特定于productFlavor的sourceSet和buildType,如下所示:
sourceSet.debug.java.srcDirs = 'src/pathToJavaDebugFiles'
可以为每个产品风格和每个buildType定义哪个,但是当我尝试动态添加它时,这不起作用。
对我有用的是(感谢这个答案How can I specify per flavor buildType sourceSets?):
sourceSets {
flavor1{
def flavorData = rootProject.ext['flavor1']
release {
java.srcDirs = flavorData.javaDirRelease
}
debug {
java.srcDirs = flavorData.javaDirDebug
}
}
}
但是我真的希望动态添加它,所以我仍然可以完整保留配置文件。我的构建配置非常复杂,并不像这里描述的那么简单,因此我不需要建议将源文件放入文件夹src / flavor1Debug,因为这些资源也是从其他productFlavors使用的,所以这不起作用。
答案 0 :(得分:2)
我想我明白了。我首先要说的是,这不是一个很好的设置,你应该真正寻求更标准的设置。
因此,对于解决方案,为了动态读取flavor源,我建议将ext结构移动到这样的结构:
ext {
sources = [
flavor1Debug : ['src/pathToJavaReleaseFiles']
flavor1Release : ['src/pathToJavaDebugFiles']
]
}
这使您可以阅读源路径并迭代project.ext.sources
中的键和值。
然后,您可以按名称查找变体并从阵列中添加源。
applicationVariants.all { variant ->
def extraSources = project.ext.sources.get(variant.name)
if (extraSources != null) {
def extraSourceFiles = extraSources.collect { project.file(it) }
def sourceSet = variant.sourceSets.find { it.name == variant.name }
sourceSet.java.srcDir extraSourceFiles
def dummyTask = project.task("register${variant.name}ExtraSourcesTask")
variant.registerJavaGeneratingTask(dummyTask, extraSourceFiles)
}
}
在变体级别执行此操作时的烦恼是您必须注册额外的源,因为此时变体对象已经从源集和产品风格中收集了源。但是,我认为这可能是动态性最小的方法。