web-dev-qa-db-ja.com

Cordova 3.4.0を取得して、ビルド時にAndroidバージョン名/コードを設定するには?

現在、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. プラットフォームフォルダーはいずれもソース管理に保存されません

これらの理由から、config.xmlでバージョン番号を設定したいと思います。何か案は?

ありがとう

27
Steven Anderson

最後にCordova 3.5.0-0.2.4でこの属性を<widget>ノードconfig.xmlに追加しました

 Android-versionCode="10"

AndroidManifest.xmlは適切に更新されました

 Android:versionCode="10" 
56
Diogo

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'を再利用できます

6
dawez

versionNameは、config.xmlからplatforms/Android(少なくともCordova 3.4.0では)のAndroidManifest.xmlファイルにコピーされるため、ここでは問題になりません。その部分は問題ありませんでした。

ただし、versionCodeをインクリメントすることは非常に困難な作業でした。実際、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 compile Android」。ビルドは「prepare」を呼び出してから「compile」を呼び出すためのショートカットであり、これら2つのタスクの間にAndroidManifest.xmlファイルを変更して上書きされないようにする必要がある場合です。

実際にpackage.jsonのバージョン値を grunt-bump で増やしてからそれを注入するため、ビルドプロセスははるかに複雑ですconfig.xmlを使用して xmlpoke Gruntとstring-replaceを使用してページについて grunt-Shell を使用して、すべてのCordovaビルドステップを実際に呼び出して、すべてをコピーし、正しい順序で実行します。

これが役立つかどうか教えてください。

5
Michael Oryl

cordova-custom-configプラグインを使用してこの問題を修正し、次にconfig.xmlで

<platform name="Android">

プット

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

値を必要なバージョンコードに変更します...

それは私には完璧に機能しました。

1
tiagomac

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では更新されません。その後、リリースビルドを取得すると、新しいバージョンコードが生成されます。

0
zabusa

誰かがまだこの問題につまずいている場合:現在の最新の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">

そして、これを実行します(たとえば、release-スクリプトで使用します):

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
Chris

AndroidManifest.xmlはcordova自体によって生成されるため、マニフェストでのすべての変更がcordovaによって元に戻されるため、変更する必要はありません。

そして、それはすべて、プラットフォームフォルダにあるbuild.gradleに責任があります

ファイル-> platform/build.gradle

検索する

if(minSdkVersion> = 20){defaultConfig.versionCode + = 9} else if(minSdkVersion = 14){defaultConfig.versionCode + = 8}

ここからバージョンコードが更新されるので、変更するか、ハードコードすることができます

0
Richen Yadav