作者:coraft | 来源:互联网 | 2023-05-22 10:16
我需要编写一个gradle脚本来在每次提交时自动对我的应用程序进行版本控制.我还需要在测试人员的应用程序中包含提交哈希作为参考.
我很困惑自动版本控制通常如何工作.有人可以解释自动转换过程吗?
1> Paul..:
我遇到了类似的问题,但不想修改versionName以包含git哈希.我们希望将其保留为1.2.2之类的东西,但仍然可以在UI中显示git哈希.
我在这里修改了另一个答案的代码,使用buildConfigField任务生成可以在Java代码中引用的BuildConfig.GitHash值.
android
在模块的build.gradle文件的部分上面添加:
def getGitHash = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = stdout
}
return stdout.toString().trim()
}
然后将以下行添加到build.gradle defaultConfig
部分的android
部分,即下面versionName
:
buildConfigField "String", "GitHash", "\"${getGitHash()}\""
这会在自动生成的BuildConfig.java文件中生成以下行:
// Fields from default config.
public static final String GitHash = "e61af97";
现在,您可以使用Java代码获取git哈希BuildConfig.GitHash
.
2> Adrián Moren..:
一个理想的解决方案是从项目的git状态中获取版本.这样,版本控制不依赖于您记住增加变量,或更改gradle或配置文件中的任何文本.另一个优点是版本名称和代码可追溯到一个特定的代码状态.
您可以在http://ryanharter.com/blog/2013/07/30/automatic-versioning-with-git-and-gradle/中找到一个描述性示例.
想法是使用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()
}
当然,您需要使用命令行git(因为git describe --tags
将执行命令以生成信息).
另一种方法(也基于从git获取版本信息)可以将该逻辑外部化为gradle插件 - 例如: - https://github.com/moallemi/gradle-advanced-build-version
- https:// github .com/infusionsoft/gradle-build-version-plugin
- https://github.com/nemerosa/versioning
要使用的将取决于您要应用的版本控制策略.
3> lessthanopti..:
我创建了Gradle插件来为您执行此操作。该项目和完整说明位于https://github.com/lessthanoptimal/gversion-plugin
要使用它,请将以下内容添加到您的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”来创建文件。您可能要考虑在gradle项目中添加以下行,project.compileJava.dependsOn(createVersionFile)
这将使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中使用它。