使用 git describe 和 Gradle 对 Android 构建进行自动版本控制

新手上路,请多包涵

我进行了广泛的搜索,但可能是由于 Android Studio 和 Gradle 的新颖性。我还没有找到有关如何执行此操作的任何描述。我想基本上完全按照 这篇文章 中描述的去做,但是使用 Android Studio、Gradle 和 Windows 而不是 Eclipse 和 Linux。

原文由 Mike Yount 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 526
2 个回答

获得最近获得关注的结果的一种更合适和更精简的方法是使用 grgit 集成,它使用 JGit Java 库。因为它使用 JGit,所以它甚至不需要安装 git 就可以工作(这简化了构建管道中的事情)。

这是一个显示类似(但在 gitVersionName 字符串中有一些附加信息)解决方案的基本示例:

 plugins {
  id 'org.ajoberstar.grgit' version '4.1.1'
}
ext {
  gitVersionCode = grgit.tag.list().size()
  gitVersionName = grgit.describe(tags: true, always: true)
}
android {
  defaultConfig {
    versionCode gitVersionCode
    versionName gitVersionName
  }
}
[...]

正如您在 Grgit API 文档 中看到的那样, describe 操作 提供了除历史记录中可访问的最新标记之外的其他信息:

查找可从 HEAD 访问的最新标记。如果标记指向提交,则只显示标记。否则,它将在标记的对象和最近提交的缩写对象名称之上附加提交的数量作为标记名称的后缀。

无论如何,它不会告诉状态是否脏。通过查看存储库的 干净状态 并在不干净的情况下附加一个字符串,可以轻松添加此信息。

原文由 Diego 发布,翻译遵循 CC BY-SA 4.0 许可协议

将以下内容放入项目的 build.gradle 文件中。无需直接修改清单:Google 提供了必要的挂钩到他们的配置中。

 def getVersionCode = { ->
    try {
        def code = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'tag', '--list'
            standardOutput = code
        }
        return code.toString().split("\n").size()
    }
    catch (ignored) {
        return -1;
    }
}

def getVersionName = { ->
    try {
        def stdout = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'describe', '--tags', '--dirty'
            standardOutput = stdout
        }
        return stdout.toString().trim()
    }
    catch (ignored) {
        return null;
    }
}
android {
    defaultConfig {
        versionCode getVersionCode()
        versionName getVersionName()
    }
}

请注意,如果机器上未安装 git,或者在获取版本名称/代码时出现其他错误,它将默认为您的 android 清单中的内容。

原文由 moveaway00 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题