编辑 flavor 和路径:
目前我有:
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']
]
}
在主build.gradle中,我也做:
apply from: 'variants.gradle'
,其中包含上述ext {}对象。sourceSet的定义如下:
sourceSets {
flavor1{}
}
这可行,但我想添加特定于productFlavor和buildType的sourceSet,如下所示:
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中使用,因此这是行不通的。
最佳答案
我觉得我懂了。我首先要再次说这不是一个很好的设置,您应该真正地朝着更标准的设置迈进。
因此,对于该解决方案,为了动态读取 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)
}
}
在变体级别执行此操作的麻烦之处在于,您必须注册额外的源,因为此时的变体对象已经从源集中和产品 flavor 中收集了源。但是,我认为这可能是动态执行此操作的最小侵入方法。