Подтвердить что ты не робот

Как получить Кордову 3.4.0 для установки имени/кода версии Android на сборке?

В настоящее время я использую Cordova 3.4.0 и CLI для создания моего проекта для целевого андроида с помощью команды:

cordova build android

ИЛИ

cordova build android --release

В моем config.xml указано следующее:

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

Полученный AndroidManifest.xml в myapp/platform/android не обновляется с версией и кодом версии, указанным в файле config.xml. Он остается по умолчанию:

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

Это ошибка? Или есть какой-то другой способ, который я должен указать versionCode и versionName для Android в файле config.xml? Даже возможно, есть ли крючок, который я могу использовать для обновления AndroidManifest.xml с правильной версией перед сборкой?

Я бы предпочел не обновлять это вручную каждый раз, когда я хочу, чтобы он изменился как:

  • Склонность к ошибкам и неуверенность
  • Это не будет очевидной заменой для незнакомых разработчиков.
  • Ни одна из папок платформы не хранится в исходном управлении

По этим причинам я хотел бы, чтобы номера версий были установлены в файле config.xml. Любые идеи?

Спасибо

4b9b3361

Ответ 1

Наконец, с Cordova 3.5.0-0.2.4 я добавил этот атрибут в <widget> node config.xml

 android-versionCode="10"

и AndroidManifest.xml был правильно обновлен до

 android:versionCode="10" 

Ответ 2

versionName здесь не должно быть проблемой, поскольку он копируется из файла config.xml в файл AndroidManifest.xml в платформах /android (по крайней мере, на Cordova 3.4.0). В этой части у меня не было проблем.

Получение версии CodeCode, тем не менее, было довольно сложной задачей. На самом деле, ряд задач, которые я добавил в Grunt Gruntfile.js.

Это строка-замена. "grunt string-replace: versionCode" будет увеличивать версию Version, сохраненную в package.json. "grunt string-replace: androidVersionCode" примет это значение и поместит его в файл platform/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 выше. Я поместил строку в package.json после строки, которая начинается с "версии":

Важным трюком, чтобы заставить это работать, - убедиться, что вместо вызова "corova build android" вы называете "cordova prepare android", затем "grunt replace-string: androidVersionCode" и затем "кордова компилирует андроид". Build - это просто ярлык для вызова "подготовить", а затем "скомпилировать", и между этими двумя задачами возникает необходимость изменить файл AndroidManifest.xml, чтобы он не был перезаписан. Кажется.

Мой процесс сборки намного сложнее, потому что я фактически увеличиваю значение версии в package.json с grunt-bump для Grunt, а затем вводя это в config.xml с помощью xmlpoke для Grunt и моей страницы, используя string-replace. Я использую grunt-shell, чтобы на самом деле вызвать все шаги сборки в Кордове, чтобы все было скопировано туда, где оно было, и выполнялось в правильном порядке.

Сообщите мне, если это поможет.

Ответ 3

после ответа MichaelOryl есть что-то, что я реализовал с помощью cordova 3.4 и с помощью инструмента bash XMLStarlet

В основном он копирует значение атрибута versionCode из файла config.xml в AndroidManifest.xml

Вместо этого:

cordova build android --release

run [должен стать script]:

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, я могу повторно использовать обычную сборку android -re cordoid build -release

Ответ 4

Я исправил эту проблему, используя плагин cordova-custom-config, а затем в файле config.xml внутри

<platform name="android">

положить

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

измените значение на желаемый код версии...

Это сработало отлично.

Ответ 5

изменить код версии в 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, он не будет обновлен. Затем, когда вы выполните сборку релизов, он будет генерировать для вас новый код версии.

Ответ 6

Если кто-то все еще спотыкается над этим: это по-прежнему актуально на текущей последней версии кордовы (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">

а затем запустите это, чтобы выполнить его (например, использовать в своем выпуске script):

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

Я, грязный, но работает:)

Ответ 7

Вам не нужно менять файл AndroidManifest.xml, поскольку он генерируется самой кордовой, поэтому каждый ваш изменения в манифесте возвращаются кордовой.

И все это отвечает за сборщик build.gradle, расположенный в папке платформы

file → platform/build.gradle

Поиск

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

поскольку ваш код версии обновляется отсюда, вы можете изменить его или выполнить жесткий код