在非Android Gradle中相当于产品flavors的东西是什么?

10
我正在创建一个桌面Java应用程序,希望创建两个版本:免费版和付费版。区别主要在于包含哪些资源文件(将来可能涉及不同的代码,但现在不是)。
我已经了解了Android build variants,通过“产品风味”可以实现这种功能。然而,这似乎是android插件独有的特性,显然在桌面上不可用。
是否存在与这些产品风味相当的东西,不依赖于android插件?
如果有帮助的话,我的最终目标是找到一种方法,可以运行Gradle build任务并输出应用程序的两个不同版本,这是我对Android构建变体所实现的理解。
1个回答

9
当然,你可以使用sourceSets并自定义Jar任务来实现相同的效果。
group 'com.jbirdvegas.example'
version '1.0-SNAPSHOT'

repositories {
    jcenter()
}

// adding the java plugin add the `jar` task to the build task graph
apply plugin: 'java'

compileJava {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

/**
 * SourceSets allows different builds to have their own
 * code.  If main and flavorOne contain com.foo.Bar then
 * the `flavorOne` jar will contain the file specified by
 * the `flavorOne` source set files.
 */
sourceSets {
    main {
        // you could also do per sourceSet resources if needed
        java.srcDir 'src/main/java'
    }
    flavorOne {
        java.srcDir 'src/flavorOne/java'
    }
    flavorTwo {
        java.srcDir 'src/flavorTwo/java'
    }
}

/**
 * Creates the first flavor's jar when the Java plugin's `Jar`
 * task is called.  Since the `jar` task depends on `flavorOne` task
 * this task will run before the generic `jar` task which produces
 * the base .jar artifact.
 */
task flavorOne(type: Jar) {
    from sourceSets.flavorOne.output
    classifier = 'flavorOneJar'
    manifest {
        attributes "Main-Class": "de.jeha.photo.mosaic.cli.Main"
    }
}

/**
 * Creates the second flavor's jar when the Java plugin's `Jar`
 * task is called.  `flavorTwo` can run before `flavorOne` because
 * both must just run before the `jar` task (base artifact)
 */
task flavorTwo(type: Jar) {
    from sourceSets.flavorTwo.output
    classifier = 'flavorTwoJar'
    manifest {
        attributes "Main-Class": "de.jeha.photo.mosaic.cli.Main"
    }
}

// be sure to build all flavors whenever the `jar` task runs
jar.dependsOn flavorOne, flavorTwo

dependencies {
    // you can declare different dependencies per sourceSets
    flavorOneCompile 'com.google.code.gson:gson:2.5'
    flavorTwoCompile 'com.something:else:1.0'
    compile 'commons-io:commons-io:2.4'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

/**
 * if you want to have specific control over the main jar's
 * build then you could configure the main jar as needed.
 * This is the equivalent of the `flavorBlah` tasks except
 * this task was added for us by the `java` plugin.  Changes
 * here will only affect the main jar built from `sourceSet.main`
 *
 * Think of this as the default where other `productFlavors` are
 * completely divorced from this jar's configuration.
 */
jar {
    manifest {
        attributes "Main-Class": "de.jeha.photo.mosaic.cli.Main"
    }
}

接下来我们可以看到不同的构建。我们的flavors和main源集jar。

$ ls -l build/libs/
-rw-r--r--  1 jbirdvegas  63209268   1.3K Jan  6 08:58 my-sweet-jar-1.0-SNAPSHOT-flavorOneJar.jar
-rw-r--r--  1 jbirdvegas  63209268   302B Jan  6 08:58 my-sweet-jar-1.0-SNAPSHOT-flavorTwoJar.jar
-rw-r--r--  1 jbirdvegas  63209268    18K Jan  6 08:58 my-sweet-jar-1.0-SNAPSHOT.jar

谢谢。还有一个问题:如何选择特定的flavor并获得IntelliJ IDEA支持?我的意思是,我希望自动完成可以与我通过flavorXCompile包含的库一起使用。 - Miha_x64
@Miha_x64,你可以尝试像这样做:configurations.compile.extendsFrom flavorX - JBirdVegas
@JBirdVegas 我遇到了一个问题:在类型为 org.gradle.api.internal.artifacts.configurations.DefaultConfiguration 的配置 ':compile' 上,无法找到参数 [task ':someFlavor'] 的方法 extendsFrom()。 - Miha_x64
也许它希望您在块configurations{compile{extendsFrom(flavorX)}}中执行此操作。该方法绝对存在:https://github.com/gradle/gradle/blob/master/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/configurations/DefaultConfiguration.java#L278 - JBirdVegas
@JBirdVegas 一样。:'( - Miha_x64
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接