将脚本升级为自动版本,并在Android中包含提交哈希

将脚本升级为自动版本,并在Android中包含提交哈希,android,git,android-studio,gradle,versioning,Android,Git,Android Studio,Gradle,Versioning,我需要编写一个gradle脚本,以便在每次提交时自动对我的应用程序进行版本设置。我还需要在测试人员的应用程序中包含提交散列作为参考 我不知道自动版本控制通常是如何工作的。有人能解释一下自动版本控制过程吗?一个理想的解决方案是从项目的git状态获取版本。这样,版本控制就不依赖于您记住增加变量,或更改gradle或config文件中的任何文本。另一个优点是版本名和代码可追溯到一个特定的代码状态 您可以在中找到一个描述性示例 想法是使用getVersionName函数获取git信息,并在gradle脚

我需要编写一个gradle脚本,以便在每次提交时自动对我的应用程序进行版本设置。我还需要在测试人员的应用程序中包含提交散列作为参考


我不知道自动版本控制通常是如何工作的。有人能解释一下自动版本控制过程吗?

一个理想的解决方案是从项目的git状态获取版本。这样,版本控制就不依赖于您记住增加变量,或更改gradle或config文件中的任何文本。另一个优点是版本名和代码可追溯到一个特定的代码状态

您可以在中找到一个描述性示例

想法是使用getVersionName函数获取git信息,并在gradle脚本中使用该函数:

/*
 * Gets the version name from the latest Git tag
 */
def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}
kts:

val gittdescription:String by lazy{
val stdout=ByteArrayOutputStream()
rootProject.exec{
命令行(“git”、“description”、“--tags”)
标准输出=标准输出
}
stdout.toString().trim()
/*“g”不属于提交id,并保留为“git”
v0.1.9-1-g3a259e0->v0.1.9-1-3a259e0
如果您希望将其删除,则*/
//.替换(“-g”和“-”)
}
当然,您需要有可用的命令行git(正如命令
git所描述的——将执行标记
来生成信息)

另一种方法(也基于从git获取版本信息)可以将该逻辑外部化到gradle插件,例如:


要使用的版本将取决于您要应用哪种版本控制策略。

我遇到了类似的问题,但不想修改版本名以包含git哈希。我们希望将其保留为类似于1.2.2的版本,但仍然可以在UI中显示git哈希

我修改了中的代码,以使用buildConfigField任务生成一个BuildConfig.GitHash值,该值可以在Java代码中引用

在模块build.gradle文件的
android
部分上方添加以下内容:

def getGitHash = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}
然后将以下行添加到build.gradle的
android
部分的
defaultConfig
部分,即
versionName
下面:

buildConfigField "String", "GitHash", "\"${getGitHash()}\""
这将在自动生成的BuildConfig.java文件中生成以下行:

// Fields from default config.
public static final String GitHash = "e61af97";

现在,您可以在Java代码中使用值得一看的
BuildConfig.GitHash

获得git哈希,这有助于简化Gradle脚本中的信息提取,包括git提交哈希。

我创建了一个Gradle插件来为您实现这一点。项目和完整说明见

要使用它,请将以下内容添加到build.gradle文件中

plugins {
  id "com.peterabeles.gversion" version "1.2.4"
}

gversion {
  srcDir = "src/main/java/"
  classPackage = "com.your.package"
  className = "MyVersion"                   // optional. If not specified GVersion is used
  dateFormat   = "yyyy-MM-dd'T'HH:mm:ss'Z'" // optional. This is the default
  timeZone     = "UTC"                      // optional. UTC is default
}
现在您只需要运行gradle任务“createVersionFile”来创建文件。您可能需要考虑将下面的行添加到您的Gealle项目 Project。Cielijava. RealSon(CREATEVIESTILE)这将导致它在每次Gradle生成项目时生成文件。有关Android的说明,请参见上面的网站

下面是该文件的外观

/**
 * Automatically generated file containing build version information.
 */
public class MyVersion {
    public static final String MAVEN_GROUP = "com.your";
    public static final String MAVEN_NAME = "project_name";
    public static final String VERSION = "1.0-SNAPSHOT";
    public static final int GIT_REVISION = 56;
    public static final String GIT_SHA = "a0e41dd1a068d184009227083fa6ae276ef1846a";
    public static final String BUILD_DATE = "2018-04-11T12:19:03Z";
    public static final long BUILD_UNIX_TIME = 1523449143116L;
}

您可能还希望将版本文件添加到.gitignore中,因为它是自动生成的,您不希望它出现在git中。

将以下代码添加到build.gradle中

def gitCommitHash = 'git rev-parse --verify --short HEAD'.execute().text.trim()
现在您可以通过
BuildConfig.git\u hash


祝您玩得开心

嗨,我遇到了这个错误:CreateProcess Error=2,系统找不到指定的文件,我的合作伙伴的任何线索都已打开GitLabs@Haroon:检查以确保git的路径位于path环境变量中。打开一个新的命令提示符/终端并键入“git--version”谢谢@Paul这正是您所写的我所做的,只是让git可用于环境变量问题是,在提交git后,整个应用程序需要重建。这非常有帮助,但是,这个插件在mono存储库中使用时存在内存问题,并且可传递的jgit依赖关系与另一个项目冲突。太棒了!我使用反射来避免视觉警告和错误,但这只是我的偏好。我也很喜欢git short rev的开箱即用,以及资源文件的生成,而不是一个类。谢谢:)非常好的主意,我将添加kotlin对应的舒适性
defaultConfig{
    ... otherConfigs
    buildConfigField("String", "GIT_HASH", "\"${gitCommitHash}\"")
}