食谱(The Cookbook)

这一节包含了很多的配方. 在这里"配方(Recipe)"指的是为了完成特定任务的一系列详细的指令. 大部分的配方都是很简单的Gradle脚本代码,当然我们也会有少量的解释帮助初学者使用这些代码.

创建反混淆的jar文件

task deobfJar(type: Jar, dependsOn: 'jar') {
    from "build/source/main"
    classifier "dev"
}
artifacts {
    archives deobfJar
}

创建源码jar文件

(译注:这个任务在ForgeGradle 2.0之后自带了,不需要自己新建了)

task sourceJar(type: Jar, dependsOn: 'sourceMainJava') {
    from "build/sources/java"
    from "build/resources/main/java"
    classifier "sources"
}
artifacts {
    archives sourceJar
}

创建Javadoc的jar文件

task javadocJar(type: Jar, dependsOn: 'javadoc') {
    from "build/docs/javadoc"
    classifier "javadoc"
}
artifacts {
    archives javadocJar
}

使用环境变量

在这里,BUILD_NUMBER 是我们使用的环境变量

version = "1.2.3." + System.env.BUILD_NUMBER

获取一个Git的哈希值(Hash)

不是所有人都安装了Git并且把它加到PATH里面,所以最好只在缺少环境变量或者怎么样的情况下使用这个方法. 在这个例子中环境变量 BUILD_NUMBER 在运行Git指令之前被先检查是否存在,如果存在直接返回 BUILD_NUMBER. 如果Git指令运行失败了,我们将会使用字符串 "GITBROK" 而不是版本号.

def getVersionAppendage() {
    if (System.env.BUILD_NUMBER)
        return System.env.BUILD_NUMBER

    def proc = "git rev-parse --short HEAD".execute()
    proc.waitFor()
    return "DEV." + proc.exitValue() ? "GITBORK" : proc.text.trim()
}

version = "1.2.3_" + getVersionAppendage()

Shading

在这个例子当中,我们需要打包EJML库到我们的jar里去. 当然,你可以对任何被当做依赖的jar随同代码进行打包. 每个库的文件都在不同的包(Package)里面,在这里EJML的根包(Root Package)是 org.ejml,并且我想把它重定位到 your.new.package.here.ejml 去. 注意包名称里的点(.)被替换成了斜线(/).

minecraft {
    srgExtra "PK: org/ejml your/new/package/here/ejml"
}

configurations {
    shade
    compile.extendsFrom shade
}

dependencies {
    shade 'com.googlecode.efficient-java-matrix-library:ejml:0.25'
}

jar {
    configurations.shade.each { dep ->
        from(project.zipTree(dep)){
            exclude 'META-INF', 'META-INF/**'
            // 如果你愿意也可以在这里排除(Exclude)其它文件,或者复制META-INF
        }
    }
}