2014-04-11 64 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}

爲您的版本的代碼是從這裏更新,你可以改變它或硬編碼

相關問題