如何在纯Java gradle模块中模拟Android的productFlavors? [英] How to emulate Android's productFlavors in a pure java gradle module?

查看:61
本文介绍了如何在纯Java gradle模块中模拟Android的productFlavors?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要三种口味:

  • fake
  • 登台
  • 产品

fake 将提供类似 FakeUser FakeUserDb 的类-将这些类 not 编译为 prod 风格.

fake will provide classes like FakeUser, FakeUserDb - it's very important that these classes are not compiled into the prod flavor.

prod staging 完全相同,只是我需要将一个不同的 String url 编译为 prod staging .

prod and staging are completely identical, except that I need to compile a different String url into prod vs staging.

因此,我需要创建抽象"的 real 风格,同时 prod staging 都可以继承.

So, I need to create an "abstract" real flavor that both prod and staging inherit.

这可以通过android gradle插件轻松完成,但是如何在纯Java gradle模块中实现呢?

This can be easily done with the android gradle plugin, but how can I do it in a pure java gradle module?

推荐答案

对于每种口味,您都想

  1. 创建一个 SourceSet 这样被编译
  2. 进行 $ {flavor}编译 配置扩展主要的 compile 配置(请参见表45.6 JarTask (将风味用作分类器)
  3. 发布罐子工件,以便可以通过分类符
  1. Create a SourceSet so it will be compiled
  2. Make the ${flavour}Compile Configuration extend the main compile configuration (see table 45.6 here for the configurations per SourceSet created by the java plugin)
  3. Create a JarTask (using the flavour as a classifier)
  4. Publish the jar artifact so the flavour can be referenced via the 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
}

然后,要引用另一个项目中的一种口味,您可以执行以下一项操作:

Then, to reference one of the flavours in another project you could do one of the following:

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'
}

这篇关于如何在纯Java gradle模块中模拟Android的productFlavors?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆