4

编辑口味和路径:

目前我有:

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 的 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 使用的,所以这不起作用。

4

1 回答 1

2

我想我明白。我首先要再说一遍,这不是一个很好的设置,您应该真正考虑转向更标准的设置。

因此,对于解决方案,为了动态读取风味源,我建议将您的 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)
        }
    }

在变体级别这样做的烦恼是您必须注册额外的源,因为此时变体对象已经从源集和产品风味中收集了源。但是,我认为这可能是动态执行此操作的侵入性最小的方式。

于 2017-01-13T21:09:23.473 回答