Gradle Script

October 1, 2021 ยท View on GitHub

Introduction

Gradle script is useful when we try to apply HeadVer to an Android build.

How to Use

Android build can be applied as below example.

gradlew assembleRelease -Pversion.head=1 -Pversion.build=67


ext {
    head = (rootProject.properties.get("version.head") as Integer)
    build = (rootProject.properties.get("version.build") as Integer)
}

android {
    defaultConfig {
        versionName "${project.head}.${new version().getYearWeek()}.${project.build}"
        // ...
    }
}

Code

class version {
    static def getYearWeek() {
        getYearWeek(Calendar.getInstance())
    }

    static def getYearWeek(Calendar calendar) {
        calendar.setMinimalDaysInFirstWeek(4)
        calendar.setFirstDayOfWeek(Calendar.MONDAY)
        calendar.setTimeZone(TimeZone.getTimeZone("UTC"))

        int year = calendar.get(Calendar.YEAR) % 100
        int week = calendar.get(Calendar.WEEK_OF_YEAR)

        // this prevents from having 1801 at the last week of the year 2019. It should be 1901
        if (week == 1 && calendar.get(Calendar.DATE) > 20) {
            year += 1
        }
        // this prevents from having 1053 at the last week of the year 2010. It should be 0953
        if (week >= 52 && calendar.get(Calendar.DATE) <= 7) {
            year -= 1
        }
        return "${String.format("%02d", year)}${String.format("%02d", week)}"
    }
}

The getYearWeek() method gives two usages as below.

// generates middle value based on today
new version().getYearWeek()

// generates middle value based on Calendar data
new version().getYearWeek(Calendar calendar)

Tip for Gradle users

  • "I'm familiar with the way of '-SNAPSHOT' versioning, how can I achieve similar dev experience?" The recommendation is to use gradle dependency syntax {head}.+. It retains to get same head version at every build as like -SNAPSHOT does. When the {head} version is getting stabled, receivee developer should change the version to fixed number.