【问题标题】:Gradle SourceSets by productFlavor and buildTypeGradle SourceSets 按 productFlavor 和 buildType
【发布时间】:2017-05-26 04:06:17
【问题描述】:

编辑风格和路径:

目前我有:

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

【问题讨论】:

  • 我仍然不清楚你想要什么......你说I want to do add a sourceSet 但代码 sn-p 是在现有的 sourceSet 上设置 java 源目录?此外,您还有一个来自 gradle 文件的申请; variants.gradle 中有什么内容?那是你定义 ext {} 对象的地方吗?那么javaDirRelease是从哪里来的呢?
  • 我对答案进行了一些编辑,因此您对 variables.gradle 有更好的理解,该文件仅包含源目录的路径,仅此而已。 “添加到 sourceSet”是一种语义误解,我的意思是“设置一个 sourceSet”。 variables.gradle 包含 ext{} 对象 yes。

标签: android gradle android-gradle-plugin android-productflavors android-build-type


【解决方案1】:

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

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

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

【讨论】:

  • 嘿@saadfarooq,谢谢你的回答。不幸的是,我有 3 种口味,还有一些其他来源,例如 NotificationMechanism、AdLibraries。现在只有第 2 和第 3 风味需要包含 NotificationMechanism,第 1 风味需要 NotificationMechanism 和 AdLibraries。就我而言,我有 12 种口味和其他来源,因为您可能认为设置的复杂性更高。我不知道如何以这种方式更改设置。
  • 所有你需要做的就是改变你的 ext gradle 文件......如果你不能这样做,你就会被你所拥有的东西困住。
  • @SaadFarooq 感谢您发布此内容,它非常有用。然而,在我的项目中,* applicationVariants 是空的,即使我有多种风格和构建类型。在初始化所有风格和构建类型后,我将它打印到日志中。你知道为什么它可能是空的吗?
  • @AntonCherkashyn 如何打印出来?您必须在 project.afterEvaluate 中进行操作才能使其正常工作。
猜你喜欢
  • 2015-07-25
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2018-08-14
相关资源
最近更新 更多