如何在项目中重用gradle定义

时间:2017-08-14 07:36:06

标签: gradle

我正在开发一组项目,每个项目都使用Gradle作为构建工具。这不是一个多项目设置,尽管我希望能够在每个项目中重复使用一些常见的Gradle脚本,以保证项目相关的一致性。

例如,对于Java组件,我希望生成的JAR文件中的清单文件具有相同的信息。特别是,所有项目都将具有相同的主要和次要版本号,而补丁版本将是项目特定的。

这是我迄今为止所做的尝试:

master.gradle - 在项目间共享

group 'com.example'

ext.majorVersion = 2
ext.minorVersion = 3
ext.patchVersion = 0; // Projects to override

def patchVersion() {
    return patchVersion;
}

apply plugin: 'java'

jar {
    manifest {
    attributes 'Bundle-Vendor': 'Example Company',
        'Bundle-Description': 'Project ABC',
        'Implementation-Title': project.name,
        'Implementation-Version': majorVersion + '.' + minorVersion + '.' + patchVersion()
    }
}

build.gradle - 其中一个项目

apply from: 'master.gradle'

patchVersion = 3

task hello {
    println 'Version: ' + majorVersion + '.' + minorVersion + '.' + patchVersion
}

如果我从命令行运行gradle hello jar,我会从Version: 2.3.3任务获得hello。但是,JAR文件清单包含2.3.0,这不是我想要的。如何在清单中获得正确的补丁版本?更一般地说,我如何让项目向主脚本提供信息?

1 个答案:

答案 0 :(得分:0)

根据@Oliver Charlesworth的建议,我想出了以下内容。我必须编写一个简单的插件来保存版本信息并将其用作扩展对象。请注意(根据gradle文件中的注释的建议),应用和设置项目的顺序非常重要。不同的排序会导致编译器错误或在设置之前使用的值。

如果有人想提出改进建议,请这样做。

master.gradle

group 'com.example'

// N.B. The individual project must have applied the semantic version
// plugin and set the patch version before applying this file.
// Otherwise the following will fail.
// Specify the major and minor version numbers.
project.semver.major = 2
project.semver.minor = 3
project.version = project.semver

apply plugin: 'java'

jar {
    manifest {
        attributes 'Bundle-Vendor': 'Example Company',
            'Bundle-Description': project.description,
            'Implementation-Title': project.name,
            'Implementation-Version': project.semver
    }
}

build.gradle

// Describe the project before importing the master gradle file
project.description = 'Content Upload Assistant'

// Specify the patch version
apply plugin: SemanticVersionPlugin
project.semver.patch = 3

// Load the master gradle file in the context of the project and the semantic version
apply from: 'master.gradle'

简单的插件可以在下面找到。目前它与应用程序源代码一起使用,但它应该与主gradle文件一起移出到库中。

buildSrc/src/main/groovy/SemanticVersionPlugin.groovy

import org.gradle.api.Plugin
import org.gradle.api.Project

class SemanticVersionPlugin implements Plugin<Project> {
    void apply(Project project) {
        project.extensions.create('semver', SemanticVersion)
    }
}

class SemanticVersion {
    int major
    int minor
    int patch

    String toString() {
        return major + '.' + minor + '.' + patch
    }
}