2014-04-11 65 views
27

我目前使用的科尔多瓦3.4.0和CLI来构建我的项目使用命令定位到Android设备:如何获取Cordova 3.4.0在版本上设置Android版本名称/代码?

cordova build android 

OR

cordova build android --release 

我config.xml中有如下规定:

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

由此产生的AndroidManifest.xml中的myapp/platforms/android未得到更新版本和版本代码在config.xml中指定。它保持为默认值:

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

这是一个错误?还是有其他的方式,我应该在config.xml中为Android指定versionCode和versionName?甚至可能,有没有一个钩子可以用来在构建之前用正确的版本更新AndroidManifest.xml?

我宁可不要这个手动我希望它可以改变每个时间更新:

  1. 它很容易出错,繁琐
  2. 它不会是一个显而易见的事情不熟悉的开发商
  3. 改变
  4. 没有平台文件夹存储在源代码管理中

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

感谢

+0

机器人:=的versionName“1.5.3 “会自动更新小部件版本在config.xml中,所以没有什么可做的。对于versionCode,我还没有找到任何东西,我认为config.xml中的versionCode仅支持phonegap构建,但不支持cordova或phonegap本地构建。我不知道是否已经存在一个钩子,但你应该能够建立自己的,并将其放入after_prepare。 – QuickFix

+0

我重新检查是否android:versionName =“1.X.X”会自动更新,我发现它没有。我删除了平台,并从头开始,并具有相同的结果 - android:versionName =“1.0”。你能证实这个在Cordova 3.4.0上的作品吗? –

+0

我确认它至少适用于我。你只有在添加平台后,或者在构建之后才检查? – QuickFix

回答

56

最后用Cordova 3.5.0-0.2.4我加入这个属性到<widget>节点​​3210

android-versionCode="10" 

AndroidManifest.xml了适当的更新,以

android:versionCode="10" 
+0

我刚刚在3.4.0中试过这个,但它不起作用。我会在3.5.0以后尝试。 –

+0

肯定它是在3.5.0上工作,漂亮干净的解决方案 – Mobiletainment

+0

在哪里添加?这是'widget'元素的属性? – Dozer

5

没有的versionName应该是一个问题就在这里,因为它会从config.xml文件复制到平台AndroidManifest.xml文件/安卓(至少在科尔多瓦3.4.0)。那部分我没有问题。

获取versionCode递增,但是,这是一项相当艰巨的任务。实际上,我添加到Grunt的Gruntfile.js中的一系列任务。

这是string-replace任务。 “grunt string-replace:versionCode”将增加存储在package.json中的versionCode。 “咕噜字符串替换:androidVersionCode”将采取价值,放入平台/安卓/ 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安装咕噜字符串替换):

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

你需要添加一行如以下为这一切工作的文件的package.json:

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

它会增加字符串替换:versionCode任务上面。我把这条线放在包里。json以“版本”开头的行之后:

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

我的构建过程要复杂得多,因为我实际上grunt-bump用于步兵在递增的的package.json版本值,然后注入到这一点使用xmlpoke的咕噜config.xml和使用我对网页字符串替换 。我使用grunt-shell来实际调用所有Cordova构建步骤,以将所有内容复制到所需位置并按正确顺序运行。

让我知道这是否有帮助。

+1

你可以调用'cordova build android',然后使用'after_prepare'钩子在编译阶段之前复制/替换值 – sgimeno

5

MichaelOryl的答案下面有东西,我使用cordova 3.4并使用bash工具执行XMLStarlet

基本上它拷贝从config.xml中的versionCode属性的在AndroidManifest.xml

代替运行此:

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 

这样当我升级到科尔多瓦3.5时,我可以重复使用通常的'cordova build android --release'

1

我修复了这个问题EM使用科尔多瓦 - 自定义插件配置,然后在config.xml文件里面

<platform name="android"> 

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

值更改为想要的版本代码...

它的工作完美地我。在AndroidManifest.xml(/platforms/android/AndroidManifest.xml)

+0

由于科尔多瓦6.5这不起作用...如果添加我得到价值1088 – krv

0

编辑版本代码

<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它不会update.then当你把一个发布版本它会为你生成新的版本代码。

0

如果有人仍然绊倒这一个: 它仍然是在当前最新版本科尔多瓦(6.4.0)真。 如果没有一些詹金斯或其他工艺来为你做这个,你可以把版本的代码在自己的行

<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"> 

,然后运行该到了”它(例如,在你的发布使用 - 脚本):

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 

严,脏但工程:)

0

你有没有需要改变的AndroidManifest.xml因为它是由科尔多瓦自身产生所以每次你在清单的变化是由科尔多瓦

恢复

而这一切负责是的build.gradle位于平台文件夹

文件 - >平台/的build.gradle

搜索

如果(的minSdkVersion> = 20){defaultConfig.versionCode + = 9}否则如果(的minSdkVersion = 14){defaultConfig.versionCode + = 8}

为您的版本的代码是从这里更新,你可以改变它或硬编码

相关问题