Maven 或 Gradle 构建类型/变体

Posted

技术标签:

【中文标题】Maven 或 Gradle 构建类型/变体【英文标题】:Maven or Gradle build types/variants 【发布时间】:2015-05-19 14:52:33 【问题描述】:

android Gradle 插件增加了对构建类型和构建变体的支持,让您可以在构建步骤(例如,调试或发布)选择要构建的应用程序版本。

这对于 Gradle 项目来说是一个非常有用的功能,因为您可以拥有 2 个版本的应用程序,它们在某些情况下的行为可能会有所不同,或者根据构建类型具有不同的配置文件或属性。

现在,我的问题是:来自 Maven 或 Gradle 的非 Android Java 项目是否有类似的功能/实现?我正在专门寻找 Java Web 应用程序,但我认为这个问题也可能有更大的目标。

【问题讨论】:

Maven 有配置文件。 Gradle 是编程的,因此自定义代码选择配置(或提供支持的插件)。 据我所知,Maven 配置文件只允许管理 pom.xml 文件的不同配置。 Android Gradle 插件不仅为您提供了一个 BuildConfig 类,您可以在代码中的任何位置使用它来检查当前正在运行的构建类型,它还提供了为 any指定构建类型特定文件的能力> 项目中的文件。与此相比,maven 的配置文件看起来就像一个完整的儿童玩具。还是我错过了什么?关于 Gradle,我还没有真正理解你的意思。 如果构建不符合其先入为主的期望,Maven 将非常脆弱。配置文件是一种强制不同流程的黑客。对于 Gradle,我的意思是,由于您可以编写 Groovy 代码,因此很容易根据标志自定义构建和任务图。插件就是为重用而打包的相同 Groovy 代码。如果不存在适用于您的案例的现有插件,则可以通过首先清除构建文件中的代码然后迁移到自定义插件以供其他人使用来轻松编写一个。 我真的不相信您理解我所说的 BuildConfig 和每种构建类型的特定文件的意思,因此您的答案如此含糊。长话短说,这两个构建系统都没有提供此功能。这里希望 Gradle 能够以与 Google 使用其 Android 插件相同的方式实现变体功能。 【参考方案1】:

言归正传,没有含糊的回答,下面是Luke Daley (Gradleware Engineer)对此事的官方回复:

这是我们正在积极努力的事情。我们正在努力支持 变体的概念以一般的方式,所以会有一个 跨领域的一致方法。这是一个深刻的,深刻的,虽然改变 所以涉及很多。

您可以期待在 Gradle 2.5 和 开。

后期编辑:我终于能够通过使用 SourceSets 而不是 Build Types & Variants 在 JavaEE webapp 项目上实现这一点。考虑到 SourceSets 已经存在了很长时间,显然你可以在很久以前做到这一点......但即使是 gradle 工程师也无法正确解释如何做到这一点......

无论如何,请查看下面的 build.gradle 代码,其中我们为两个 SourceSet 使用相同的输出目录,然后指定要构建的 WAR 插件的位置:

apply plugin: 'war'

sourceSets 
    main 
        output.resourcesDir = 'build/resources'
        output.classesDir   = 'build/classes'
    
    debug 
        java 
            compileClasspath += main.output
            runtimeClasspath += main.output
        
        output.resourcesDir = 'build/resources'
        output.classesDir   = 'build/classes'
    


task assembleDebugWar(type: War) 
    from sourceSets.debug.output
    archiveName "ROOT.war"


task assembleReleaseWar(type: War) 
    from sourceSets.main.output
    archiveName "ROOT.war"

【讨论】:

Gradle v2.10 目前已发布。这个计划中的功能发生了吗?如果是这样,我在哪里可以找到有关它的文档? 好问题。从那以后我就再也没有搜索过这个。但这是我现在能找到的docs.gradle.org/current/userguide/… 该页面的顶部列出了这适用于的几种语言,但不是 Java(或任何 JVM 语言),这正是 OP 所寻找的。也挖掘了一下,看起来构建变体的实现已经在 since Gradle 1.9 附近,并且从那时起几乎没有变化。 是的,我最初是想为我们的 Java Web 应用程序使用 gradle 而不是 maven,但就像我最初所说的,这也适用于其他语言。我现在也发现了这个,它指定了源集而不是构建类型/风格:docs.gradle.org/current/userguide/java_plugin.html 你打算很快实现这个吗?如果没有,我可以尝试再次联系 Gradle 工程师以获得更完整的答案。 经过大量的摆弄,我设法让它与 SourceSets 一起工作。查看上面的代码。

以上是关于Maven 或 Gradle 构建类型/变体的主要内容,如果未能解决你的问题,请参考以下文章

Android知识要点整理(19)----Gradle 之构建变体

Android - 仅在发布版本变体上执行 Gradle 任务

Android 库 - 使用 Gradle 将多个变体发布到本地 Maven 存储库

Android Gradle 插件Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )

travis.ci 上的 Android 构建变体

Gradle仓库配置