如何让Cordova 3.4.0在构建时设置Android版本名称/代码?

时间:2014-04-11 01:05:57

标签: cordova cordova-3

我目前正在使用Cordova 3.4.0和CLI来构建我的项目,使用以下命令来定位android:

cordova build android

OR

cordova build android --release

我的config.xml具有以下指定:

<widget id="com.example.myapp" 
        version="0.0.3" 
        versionCode="2" 
        ...
        >
</widget>

myapp / platforms / android 中生成的AndroidManifest.xml未使用config.xml中指定的版本和版本代码进行更新。它保持默认值:

<manifest 
        android:versionCode="1" 
        android:versionName="1.0"
        ...
</manifest>

这是一个错误吗?或者是否有其他方法我应该在config.xml中为Android指定versionCode和versionName?即便如此,我是否可以使用钩子在构建之前使用正确的版本更新AndroidManifest.xml?

我希望每次我希望它更改时都不必手动更新:

  1. 这很容易出错,而且很费劲。
  2. 对于不熟悉的开发人员来说,改变它并不是一件明显的事情
  3. 没有平台文件夹存储在源代码管理中
  4. 由于这些原因,我希望在config.xml中设置版本号。有什么想法吗?

    由于

7 个答案:

答案 0 :(得分:56)

最后使用Cordova 3.5.0-0.2.4我将此属性添加到<widget>节点config.xml

 android-versionCode="10"

并且AndroidManifest.xml已正确更新为

 android:versionCode="10" 

答案 1 :(得分:5)

versionName在这里应该不是问题,因为它从config.xml复制到platforms / android中的AndroidManifest.xml文件(至少在Cordova 3.4.0上)。那部分我没有问题。

但是,增加版本代码是一项非常重要的任务。实际上,我在Grunt的Gruntfile.js中添加了一系列任务。

这是string-replace任务。 “ grunt string-replace:versionCode ”将增加存储在package.json中的versionCode。 “ grunt string-replace:androidVersionCode ”将获取该值并将其放入platforms / android / AndroidManifest.xml文件中:

    // STRING-REPLACE
    'string-replace': {
        versionCode: { // update the version code stored in package.json
            options: {
                replacements: [
                    {
                        pattern: /['"]androidVersionCode['"]:.*?['"](\d*)['"]/ig,
                        replacement: function (match, p1, offset, string) {
                            return '"androidVersionCode": "' + (parseInt(p1) + 1) + '"';
                        }
                    }
                ]
            },
            files: {
                'package.json': 'package.json'
            }
        },

        androidVersionCode: { // update the version code stored in AndroidManifest.xml
            options: {
                replacements: [
                    {
                        pattern: /android:versionCode=['"](\d*)['"]/ig,
                        replacement: function (match, p1, offset, string) {
                            var pkg = grunt.file.readJSON('package.json');
                            grunt.log.writeln("pkg.androidVersionCode: " + pkg.androidVersionCode);
                            grunt.log.writeln('Returning: ' + 'android:versionCode="' + pkg.androidVersionCode + '"');
                            return 'android:versionCode="' + pkg.androidVersionCode + '"';
                        }
                    }
                ]
            },
            files: {
                'platforms/android/AndroidManifest.xml': 'platforms/android/AndroidManifest.xml'
            }
        }
    }

在使用之前需要从Gruntfile.js文件中调用,当然(以及npm install grunt-string-replace):

grunt.loadNpmTasks('grunt-string-replace');

您需要在package.json文件中添加以下内容,以便全部工作:

"androidVersionCode": "13", // or whatever value is current for you

它将通过上面的 string-replace:versionCode 任务递增。我将行放在以“version”开头的行之后的package.json中:

让这个工作的一个重要技巧是确保不要调用“cordova build android”而是调用“cordova prepare android”,然后“grunt replace-string:androidVersionCode”,然后“cordova编译android”。 Build只是调用“prepare”然后“编译”的快捷方式,而这两个任务之间就是你必须修改AndroidManifest.xml文件以防止它被覆盖,似乎。

我的构建过程要复杂得多,因为我实际上使用grunt-bump为Grunt增加package.json中的版本值,然后使用xmlpoke将其注入config.xml,用于Grunt和我的页面使用 string-replace 。我使用grunt-shell来实际调用所有Cordova构建步骤,以便将所有内容复制到它所在的位置并以正确的顺序运行。

如果有帮助,请告诉我。

答案 2 :(得分:5)

根据 MichaelOryl 的回答,我使用cordova 3.4并使用bash工具XMLStarlet

实现了一些功能。

基本上它从AndroidManifest.xml中的config.xml复制versionCode属性的值

而不是运行:

cordova build android --release

运行[应该成为一个脚本]:

cordova prepare android
# grab version code from config.xml
VERSION_CODE=$(xmlstarlet sel -t -v "//@versionCode" "config.xml")
# write correct version code in manifest
xmlstarlet ed -L -u "/manifest/@android:versionCode" -v "$VERSION_CODE" "platform/android/AndroidManifest.xml"
cordova compile android --release

通过这种方式,当我升级到cordova 3.5时,我可以重复使用通常的&cordova build android --release&#39;

答案 3 :(得分:1)

我使用cordova-custom-config插件解决了这个问题,然后在

中的config.xml中解决了这个问题
<platform name="android">

<preference name="android-manifest/@android:versionCode" value="108" />

将值更改为所需的版本代码...

它对我来说很完美。

答案 4 :(得分:0)

在AndroidManifest.xml中编辑版本代码(/platforms/android/AndroidManifest.xml)

<manifest android:hardwareAccelerated="true" android:versionCode="2"android:versionName="0.0.2" package="com.ionicframework.zinescreen841178"   xmlns:android="http://schemas.android.com/apk/res/android">

更改版本代码,而不是在config.xml中,它不会更新。然后当你进行发布版本时,它将为你生成新的版本代码。

答案 5 :(得分:0)

如果有人还在绊倒这个: 目前最新的cordova版本(6.4.0)仍然如此。 如果你没有为你做一些Jenkins或其他程序,你可以将版本代码放在自己的行中

<widget id="com.example.yourapp" 
    android-versionCode="1112" 
    version="1.1.3" 
    xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">

然后将其运行到&#39;它(例如在你的发布脚本中使用):

VersionCode=`cat config.xml | grep android-versionCode | sed -e 's/.*android-versionCode=\"\(.*\)\"/\1/'`
VersionCode=$((VersionCode+1))
sed -i "s/.*android-versionCode=\"\(.*\)\"/    android-versionCode=\"$VersionCode\"/" config.xml

呀,肮脏但有效:)

答案 6 :(得分:0)

您无需更改AndroidManifest.xml,因为它是由cordova自己生成的,因此您在Manifest中的每个更改都会被cordova还原

所有它负责的是build.gradle位于平台文件夹

file - &gt;平台/的build.gradle

搜索

if(minSdkVersion&gt; = 20){defaultConfig.versionCode + = 9}否则if(minSdkVersion = 14){defaultConfig.versionCode + = 8}

因为您的版本代码从此更新,您可以更改它或硬编码