Использование переменных среды / параметризация config.xml

Я создаю проект ionic / cordova, используя плагин cordova-plugin-facebook4 для доступа к аутентификации Facebook. В config.xml это выглядит так:

 <plugin name="cordova-plugin-facebook4" spec="~1.7.1"> <variable name="APP_ID" value="1234567890123456"/> <variable name="APP_NAME" value="My_Appy_App"/> </plugin> 

Это работает нормально, но APP_ID мы используем, предназначен для приложения dev, и у нас есть отдельное приложение facebook для других сред, таких как QA.

Есть ли способ параметризовать эти переменные в config.xml и заменить их как часть шага сборки? Что-то вроде:

 <plugin name="foo" spec="~0.0.0"> <variable name="bar" value="${env.APP_ID}"/> </plugin> 

… а затем запустить APP_ID=baz ionic build android или что-то в этом роде.

Я ничего не вижу в документации по cordova, которая позволяет вам это делать.

Как вы упомянули в сообщении, документации в этой документации нет. Проведя некоторое время на этом анализе, я пришел к выводу:

Существует некоторая минимальная помощь, готовая для параметризации переменных плагина, доступных в config.xml . Это может быть достигнуто с помощью переменных предпочтений, как указано в официальной ссылке cordova . Но проблема с этим подходом заключается в том, что его работа зависит от того, как кодируется плагин.

Я пробовал этот подход с плагином facebook, но он не работал 🙁 Я пробовал, как показано ниже:

 <preference name="MY_CUSTOM_STRING" default="12345678901234567" /> <plugin name="cordova-plugin-facebook4" spec="~1.7.1"> <variable name="APP_ID">$MY_CUSTOM_STRING</variable> <variable name="APP_NAME" value="My_Appy_App"/> </plugin> 

Пробовал тот же подход для плагина google maps, и он работал 🙂 Я пробовал, как показано ниже:

 <preference name="MY_CUSTOM_STRING" default="12345678901234567" /> <plugin name="cordova-plugin-googlemaps" spec="~1.3.9"> <variable name="API_KEY_FOR_ANDROID">$MY_CUSTOM_STRING</variable> </plugin> 

Поэтому все, что я мог заключить, заключается в том, что параметр параметризации зависит от кода основного плагина.

В случае с плагином facebook, если вы хотите параметризовать переменную APP_ID , я думаю, что крючки – это способ продолжения. Даже простой пакетный файл Windows для замены соответствия строк должен быть прекрасным, и его можно вызвать при выполнении команды pre build для достижения того, что вам нужно. Надеюсь, поможет.

ОБНОВИТЬ:

Я согласен с комментариями Брэндона.

С ограниченным временем, которое у меня было, я смог придумать крючок кордоны, который решает эту проблему. Это может быть грубый способ, и его можно также уточнить, но на данный момент этот подход работает отлично. Выложили крючок в качестве примера приложения на моей странице github, и файл README имеет полную информацию об этом. Надеюсь, поможет. Держи меня в курсе.

Решение Ghandi с использованием крючков cordova – хороший пример того, как это можно сделать, хотя это специально окна, поскольку он использует командный файл и PowerShell для скрипта hook.

В качестве кросс-платформенного решения вы можете использовать какой-то инструмент построения поверх кордовы. Для проекта, над которым я работаю, у нас есть проект cordova в подкаталоге и уже используют gulp для создания остальной части нашего приложения, поэтому мы изменили нашу задачу, которая копирует наши кордовые активы в каталог сборки, чтобы он также выполнял поиск И заменить на config.xml . Он вытягивает замены из переменных окружения и использует библиотеку dotenv для загрузки среды из файла .env (который не проверяется в репозитории).

 var gulp = require('gulp'), replace = require('gulp-replace'), gutil = require('gulp-util'), filter = require('gulp-filter'), path = require('path'), dotenv = require('dotenv'), argv = require('yargs').argv, isRelease = !!(typeof argv.release !== 'undefined' ? argv.release : (typeof argv.r !== 'undefined' ? argv.r : false)); gulp.task('cordova_assets', ['clean', 'templates'], function() { dotenv.config({path: path.join(__dirname, 'cordova', '.env'), silent: true}); var f = filter(['cordova/config.xml'], {restore: true}); return gulp.src(['cordova/**/*'], {base: './'}) .pipe(f) .pipe(replace(/\$\$([A-Z0-9_]+)/gi, function(substr, varname) { var repl = ''; if(!isRelease && typeof process.env[varname + '_DEBUG'] !== 'undefined') repl = process.env[varname + '_DEBUG']; else if(isRelease && typeof process.env[varname + '_RELEASE'] !== 'undefined') repl = process.env[varname + '_RELEASE']; else if(typeof process.env[varname] !== 'undefined') repl = process.env[varname]; else { throw new gutil.PluginError('cordova_config', { message: 'expected but could not find the environment variables "' + varname + '" or "' + varname + '_' + (isRelease ? 'RELEASE' : 'DEBUG') + '" which is used in cordova/config.xml. ' + 'Add it to cordova/.env or specify them explicitly when running the build command.' }); } console.log('replacing "%s" with "%s"', substr, repl); return repl; })) .pipe(f.restore) .pipe(gulp.dest('build')); }); 

Он заменит любые переменные в файле config.xml, которые начинаются с двух знаков доллара и состоят из буквенно-цифровых символов и подчеркиваний со значением соответствующей переменной среды, если она существует (и выдает ошибку, если она не указана). Кроме того, вы можете суффикс переменной в _DEBUG config.xml с помощью _DEBUG или _RELEASE и вместо этого они будут использовать эти значения.

Он предполагает следующую структуру проекта:

  • /
    • cordova
      • config.xml
      • … (остальная часть вашей кордовой установки)
      • .env (содержит переменные среды)
    • build (каталог сборки и конечный результат приложения cordova)