8

好的,我已经在新的Android 构建系统上观看了 Xavier Ducrohet 的 YouTube 视频。我什至转而使用 Android Studio 并对此感到满意。现在我需要自定义构建规则以按照我想要的方式做事,其中之一是在清单文件中自动设置codeVersionand 。codeName

Xavier 在他的一张幻灯片中展示了如何做到这一点:

def getVersionCode() {
    def code = ...
    return code
}

android {
    defaultConfig {
        versionCode getVersionCode()
    }
}

那么有人会这么好心地指出我填写这些点的好资源吗?

更具体地说,我想运行一个脚本git describe --dirty | sed -e 's/^v//'来确定versionNamegit tag | grep -c ^v获取versionCode.

谢谢

更新

我尝试了以下gradle.build脚本但没有成功。它构建得很好,但我安装的应用程序的应用程序信息页面中的版本名称没有改变。

task getVersionName(type:Exec) {
  commandLine '../scripts/version-name.sh'

  //store the output instead of printing to the console:
  standardOutput = new ByteArrayOutputStream()

  //extension method stopTomcat.output() can be used to obtain the output:
  ext.output = {
    return standardOutput.toString()
  }
}

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile project(':Common')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16

        versionName getVersionName()
    }
}

如果我将配置替换为versionName getVersionName()thenversionName 'Some Text'它可以工作,并且构建名称将Some Text出现在 App Info 中。那么为什么我的 getVersionName 函数不起作用呢?

更新 2

仍然不工作 - 但几乎!

外壳脚本:

#/bin/bash

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

logger "Build version: ${VERSION}"

echo ${VERSION}

这有效,并且日志行确认在制作项目时多次调用该脚本。但是 versionName 仍然是空白的。我怀疑是 Gradle 方面仍未获得标准输出。

task getVersionCode(type: Exec) {
    exec { commandLine '../scripts/version-code.sh' }

    //store the output instead of printing to the console:
    standardOutput = new ByteArrayOutputStream()

    ext.output = {
        return standardOutput.toString()
    }
}

task getVersionName(type: Exec) {
    exec { commandLine '../scripts/grMobile/scripts/version-name.sh' }

    //store the output instead of printing to the console:
    standardOutput = new ByteArrayOutputStream()

    ext.output = {
        return standardOutput.toString()
    }
}

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile project(':Common')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16

        versionCode getVersionCode()
        versionName getVersionName.output()
    }
}
4

2 回答 2

2

在四处寻找之后,我终于找到了解决方案。

文件的语言 Groovybuild.gradle允许轻松运行命令。这是解决方案:

def buildCode
     = file("../scripts/version-code.sh")
         .toString().execute().text.trim().toInteger()
def buildName
     = file("../scripts/version-name.sh")
          toString().execute().text.trim()

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 12
        targetSdkVersion 16

        versionCode buildCode
        versionName buildName
    }
}

file() 应该用于引用 Gradle 中的所有文件。

"<some-command".execute()将运行该命令,并.text为您提供对 stdout. 我发现我需要运行trim()以删除尾随回车。我想我可以echo -n ${VERSION}在我的脚本中使用,但我认为该trim()方法更好,因为它允许从命令行运行脚本。

构建脚本只计算来自 git 的发布标签的数量。当我在表单中标记我的版本时:'v' <major-no> '.' <minor-no> [ '.' <bug-fix> ]它只能以小写“v”开头的标签后跟任何数字:

#/bin/bash

git tag | grep -c ^v[0-9]

在使用此配置进行构建之前,不要忘记创建至少一个发布标签。我在项目开始时按以下方式标记:

$ git tag -m "Start of development" v0.0
于 2013-06-28T06:51:48.600 回答
0

您错过了示例评论。versionName getVersionName.output()应该管用。

编辑:将您的任务代码更改为以下内容。

task getVersionName(type:Exec) {
  exec { commandLine '../scripts/version-name.sh' }

  ...
}

我也是 gradle 的新手,似乎他们有一些错误或缺少文档。由于您尝试的代码完全来自示例,可在文档中找到。

于 2013-06-14T12:10:16.913 回答