该解决方案是在 Linux 上开发的。我确信熟练的 Windows 和 Mac 开发人员可以使其适应他们的平台,但我不是这样的开发人员。Linux 是我的技能所在。
git describe --dirty
Git 在命令中有一个很好的特性。它向下扫描提交日志并找到标记,然后从那里构建一个版本字符串。如果这是一个“生产构建”,其中最后一次提交已被标记并且所有文件都已被签入,那么这就是您的版本字符串。如果这是一个开发版本,那么最后一个标签会附加额外提交的数量和一个缩写的哈希码。该--dirty
标志只是锦上添花:dirty
如果有任何修改过的文件尚未提交,它会附加单词。这非常适合android:versionName
清单文件中的属性。
对于android:versionCode
a 数字是必需的。这需要为发布而不是开发构建计时,并且由于每个发布都会有一个带有版本字符串的标签,所以我只计算这些。v<major>.<minor>[.<patch>]
我总是以where<major>
和只是数字<minor>
的形式标记我的版本。<patch>
因此,计数以小写“v”开头后跟数字的标签就是这里真正需要的。
在使用模板清单文件后,我发现最好的方法是简单地使用项目库中的 AndroidManifest.xml 文件,使用流编辑器进行编辑sed
并将结果存放在 bin/AndroidManifest.xml 中。
所以我开发了下面的脚本,将它放在与我的项目相同级别的脚本文件夹中(以便它们都可以共享相同的脚本),然后在 Eclipse 中配置一个自定义构建器。
有我称之为的脚本version.sh
:
#/bin/bash
echo "Auto Version: `pwd`"
CODE=`git tag | grep -c ^v[0-9]`
NAME=`git describe --dirty | sed -e 's/^v//'`
COMMITS=`echo ${NAME} | sed -e 's/[0-9\.]*//'`
if [ "x${COMMITS}x" = "xx" ] ; then
VERSION="${NAME}"
else
BRANCH=" (`git branch | grep "^\*" | sed -e 's/^..//'`)"
VERSION="${NAME}${BRANCH}"
fi
echo " Code: ${CODE}"
echo " Ver: ${VERSION}"
cat AndroidManifest.xml | \
sed -e "s/android:versionCode=\"[0-9][0-9]*\"/android:versionCode=\"${CODE}\"/" \
-e "s/android:versionName=\".*\"/android:versionName=\"${VERSION}\"/" \
> bin/AndroidManifest.xml
exit 0
要在此处配置构建器,请执行以下步骤:
1)。右键单击项目库并选择“属性”,然后选择“构建器”。
2)。点击“新建”按钮并选择“程序”选项。
3)。将您的版本命名为“<project> Auto Version”。此字符串需要在所有项目中都是唯一的。
4)。配置“主要”选项卡,如下所示:
4a)。在“位置”部分使用“浏览文件系统”并导航并选择脚本文件。
4b)。在“工作目录”部分使用“浏览工作区”选择项目。
5)。在“刷新”选项卡中取消选中“完成后刷新资源”。
6)。不要在“环境”选项卡中设置任何变量。
7)。在“构建选项”选项卡中:
7a)。确保勾选“在手动构建期间”,并且
7b)。“在自动构建期间”也被勾选。
7c)。我现在没有选择其他所有内容。我什至没有为它分配控制台。鹰眼可能已经发现脚本确实输出了一些信息,但现在我已经让它工作了,我只想让这个东西安静地运行而不打扰我。
8)。好的构建设置,然后将您的构建器定位在“Android Pre-Compile”和“Java Builder”之间。
在知道它们已正确版本化的情况下,返回安全地开发您的应用程序,并查看您的应用程序的信息。那个版本号是不是很酷。:-)
史蒂夫