如何在纯Java gradle模块中模拟Android的productFlavors? [英] How to emulate Android's productFlavors in a pure java gradle module?
问题描述
我需要三种口味:
-
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?
推荐答案
对于每种口味,您都想
- Create a SourceSet so it will be compiled
- Make the
${flavour}Compile
Configuration extend the maincompile
configuration (see table 45.6 here for the configurations per SourceSet created by the java plugin) - Create a JarTask (using the flavour as a classifier)
- 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屋!