最近在Android中用Ant自动打包的过程中,有个要求,是从Git获取版本提交的总次数,加上最初版本的版本号,做为最新版本的版本号。

起初是写了一个shell脚本来做这件事。

#!/bin/bash

cd /home/serious/Workspace/client/
count=`git rev-list origin/master --count`
result=2.0.$count
echo $result

sed -i "s/android:versionName=\"2.0.*\"/android:versionName=\"${result}\"/g" AndroidManifest.xml

但是这么一来,打包之前就会多一个步骤。我这么懒的人,怎么能允许这种事情发生?怎么能坐以待毙?

于是就翻看了ant的文档,找到解决方案。

在build.xml中,加入这么一段:

<target name="versioncode">
    <exec executable="sh">
        <arg value="update_vercode.sh" />
    </exec>
</target>

搞定。

但是,这样还多了个sh文件啊。我作为一个并不是处女座的洁癖,怎么能允许这种事情发生?怎么能坐以待毙?

于是找到了下面的解决方案:

<target name="versioncode">
        <exec executable="sh" outputproperty="v_name">
            <arg value="-c" />
            <arg value="git rev-list origin/master --count" />
        </exec>
        <echo>Revision (app): ${v_name}</echo>
        <replaceregexp file="AndroidManifest.xml" match='android:versionName="2.0.*"' replace='android:versionName="2.0.${v_name}"' />
</target>

Ant中执行系统命令时(比如上文的git命令和sh命令),在Windows下和在Linux下的方式是不同的。

  • Windows
<target name="help">
  <exec executable="cmd">
    <arg value="/c"/>
    <arg value="ant.bat"/>
    <arg value="-p"/>
  </exec>
</target>
  • Linux
<target name="help">
  <exec executable="sh">
    <arg value="-c"/>
    <arg value="ant.sh"/>
    <arg value="-p"/>
  </exec>
</target>