2016-05-17 65 views
4

我需要三种口味:如何在纯java的gradle模块中模拟Android的productFlavors?

  • fake
  • staging
  • prod

fake将提供类,如FakeUserFakeUserDb - 这是非常重要的是,这些类编译成prod味道。

prodstaging是完全一致的,不同之处在于我需要编译一个不同String urlprod VS staging

所以,我需要创建一个“抽象”real的味道,prodstaging继承。

这可以很容易地用android gradle插件完成,但我怎么能在纯java的gradle模块中做到这一点?

+0

你确定这些不能生成类型? AFAIK,构建类型是Gradle Android插件恰好利用的Gradle事物。 – CommonsWare

+0

哦,他们肯定可以buildTypes。在android插件术语中,我只需要stagingDebug,prodRelease和fakeDebug – ZakTaccardi

+0

@CommonsWare所以'buildType'是一个gradle概念 - 不只是一个android插件的概念?有没有关于纯java的任何文档?每谷歌搜索似乎导致我的Android插件 – ZakTaccardi

回答

3

对于每一个味道你要

  1. 创建一个SourceSet所以它会被编译
  2. 充分利用${flavour}CompileConfiguration延长主compile配置(见表45.6 here通过创建每SourceSet配置java插件)
  3. 创建一个JarTask(使用风味作为分类器)
  4. Publish the jar artifact so fla vour可以通过classifier

喜欢的东西被引用:

def flavours = ['fake', 'staging', 'prod'] 
flavours.each { String flavour -> 
    SourceSet sourceSet = sourceSets.create(flavour) 
    sourceSet.java { 
     srcDirs 'src/main/java', "src/$flavour/java" 
    } 
    sourceSet.resources { 
     srcDirs 'src/main/resources', "src/$flavour/resources" 
    } 
    Task jarTask = tasks.create(name: "${flavour}Jar", type: Jar) { 
     from sourceSet.output 
     classifier flavour 
    } 
    configurations.getByName("${flavour}Compile").extendsFrom configurations.compile 
    configurations.getByName("${flavour}CompileOnly").extendsFrom configurations.compileOnly 
    configurations.getByName("${flavour}CompileClasspath").extendsFrom configurations.compileClasspath 
    configurations.getByName("${flavour}Runtime").extendsFrom configurations.runtime 

    artifacts { 
     archives jarTask 
    } 
    assemble.dependsOn jarTask 
} 

然后,引用在其他项目的口味之一,你可以做以下之一:

dependencies { 
    compile project(path: ':someProject', configuration: 'fakeCompile') 
    compile project(path: ':someProject', configuration: 'fakeRuntime') 
    compile 'someGroup:someProject:1.0:fake' 
    compile group: 'someGroup', name: 'someProject', version: '1.0', classifier: 'fake' 
} 
+0

虽然这很有帮助,但这只是sourceSets。它没有进入配置,并且使某些gradle模块依赖于另一个模块的配置 – ZakTaccardi

+0

已更新第二种解决方案以包括每种flavor(带有唯一分类器)的工件并将其连接到DAG。这些工件可以包含在下游项目中(通过指定分类器) –

+0

太好了,谢谢!如何消耗这些jar工件?说如果你从兄弟gradle模块中消费那个罐子? – ZakTaccardi

相关问题