当前位置: 首页 > 知识库问答 >
问题:

Gradle脚本自动版本,并在Android中包含提交哈希

艾修筠
2023-03-14

我需要写一个gradle脚本来在每次提交时自动版本化我的应用程序。我还需要在测试人员的应用程序中包含提交散列作为参考。

我对自动版本控制通常的工作方式感到困惑。有人可以解释自动归因过程吗?

共有3个答案

师成弘
2023-03-14

将以下代码添加到build.gradle

def gitCommitHash = 'git rev-parse --verify --short HEAD'.execute().text.trim()
defaultConfig{
    ... otherConfigs
    buildConfigField("String", "GIT_HASH", "\"${gitCommitHash}\"")
}

现在你可以通过BuildConfig.GIT_HASH来获取git哈希

玩得高兴

何麻雀
2023-03-14

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

你可以在http://ryanharter . com/blog/2013/07/30/automatic-versioning-with-git-and-grad le/找到一个描述性的例子

这个想法是使用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 gitDescribe: String by lazy {
    val stdout = ByteArrayOutputStream()
    rootProject.exec {
        commandLine("git", "describe", "--tags")
        standardOutput = stdout
    }
    stdout.toString().trim()
    /* 'g' doesn't belong to the commit id and stands for 'git'
       v0.1.9-1-g3a259e0 -> v0.1.9-1-3a259e0
       if you like this to be removed then */
    //.replace("-g", "-") 
}

当然,您需要有可用的命令行git(因为将执行命令git描述--tags以生成信息)。

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

  • 这是一个很好的例子https://github.com/moallemi/gradle-advanced-build-version
  • 这是一个很好的例子https://github.com/infusionsoft/gradle-build-version-plugin
  • 这是一个很好的例子https://github.com/nemerosa/versioning这是一个很好的例子

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

庄萧迟
2023-03-14

我遇到了类似的问题,但是不想修改versionName来包含git散列。我们希望保持类似于1.2.2的版本,但是仍然有可能在UI中显示git散列。

我在这里修改了另一个答案中的代码,以使用buildConfigField任务生成可在Java代码中引用的BuildConfig.GitHash值。

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

def getGitHash = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

然后将以下行添加到构建的android部分的defaultConfig。gradle,即版本名下方:

buildConfigField "String", "GitHash", "\"${getGitHash()}\""

这将在自动生成的BuildConfig中生成以下行。java文件:

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

现在,您可以使用BuildConfig.gitshash在Java代码中获得git哈希。

 类似资料:
  • null null 结果(只是基于我的例子): 我们不需要在每个模块中添加相同的代码行。 大多数项目只与依赖项列表有区别。 我试图用Gralde KTS复制同样的东西,并收到以下困难: null null 其他链接: 插件应用的Gradle KTS问题。 共享常数提取的Gradle KTS问题。

  • 我也发现过类似的问题,但没有一个问题对我想做的事情很有效。我正在用Android Studio和gradle进行开发,我的构建文件中有几种口味,每种都有一个版本名。有没有办法在APK文件中包含味道的版本名?

  • 问题内容: 我参与了一个将项目从Oracle迁移到MySQL的项目。在Oracle中,当通过命令行运行批处理时,我能够创建一个引用或包含其他外部SQL脚本文件的SQL脚本。我有一个名为CreateAllTables.sql的脚本,在内部看起来像这样: 我已经知道MySQL命令行“源”命令,但是我的目标是通过一个命令行调用来调用一个包含其他脚本的主.sql脚本文件,如下所示: 所以我的问题是我该如何

  • 我有一些库脚本:lib1。groovy: lib2.groovy: lib3.groovy: 并希望在另一个脚本中使用它们:conf.groovy: conf.groovy是由用户配置的,他不知道我的后台lib脚本!他只知道提供的方法/任务:a()、b()、c()。实际上,我创建lib脚本是为了简化用户。 有没有办法将lib目录中的所有脚本(脚本lib1、lib2m、lib3)都包含到conf.g

  • 我在中使用了,但在探索外部库时,我看到了两个版本的support-v4库(23.3.0和24.0.0)。我如何找到哪个依赖项使用了Support-V4:24.0.0库?我如何强制gradle只添加23.3.0版本? 这是我在build.gradle中的依赖项列表: 我使用来避免其他人添加支持库但未发生任何更改。

  • 我正在尝试编译一个APK,它在一个JAR文件中使用一个遗留库。 我已经做了其他的问题,但没有一个对我有帮助:1、2、3和4。我甚至在github上发现了一个与我的痛苦gradle/gradle/issues/1184相关的未解决问题--没有列出本地文件依赖关系...这很糟糕,因为我花了很多时间思考文件依赖项没有被包括在内。 总之,这是我项目的build.gradle文件: 这是应用程序的构建.Gr