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

Ste*_*son 27 cordova cordova-3

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

cordova build android
Run Code Online (Sandbox Code Playgroud)

要么

cordova build android --release
Run Code Online (Sandbox Code Playgroud)

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

<widget id="com.example.myapp" 
        version="0.0.3" 
        versionCode="2" 
        ...
        >
</widget>
Run Code Online (Sandbox Code Playgroud)

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

<manifest 
        android:versionCode="1" 
        android:versionName="1.0"
        ...
</manifest>
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 这很容易出错
  2. 对于不熟悉的开发人员而言,改变它并不是一件明显的事情
  3. 没有平台文件夹存储在源代码管理中

出于这些原因,我希望在config.xml中设置版本号.有任何想法吗?

谢谢

小智 56

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

 android-versionCode="10"
Run Code Online (Sandbox Code Playgroud)

并且AndroidManifest.xml已正确更新为

 android:versionCode="10" 
Run Code Online (Sandbox Code Playgroud)


daw*_*wez 6

根据MichaelOryl的回答,我使用了cordova 3.4并使用bash工具 XMLStarlet实现了一些功能

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

而不是运行这个:

cordova build android --release
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这样当我升级到cordova 3.5时,我可以重用通常的'cordova build android --release'


Mic*_*ryl 5

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

但是,增加versionCode是一项非常重要的任务.实际上,我添加到Grunt的Gruntfile.js中的一系列任务.

这是字符串替换任务." 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'
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

grunt.loadNpmTasks('grunt-string-replace');
Run Code Online (Sandbox Code Playgroud)

您需要在package.json文件中添加如下所示的行,以便全部工作:

"androidVersionCode": "13", // or whatever value is current for you
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果这有帮助,请告诉我.