Сценарий:
 Я Ionic3 приложение Ionic3, и в моем Ionic3 config.xml есть некоторые данные, которые я хочу изменить в соответствии со своей средой (например, я хочу, чтобы идентификатор приложения Facebook имел разные значения для разработки, подготовки и производства).
 Я добился этого before_prepare создания шаблона config.xml (файл config.tpl.xml) и before_prepare cordova для замены переменных в шаблоне на правильные значения и сохранения сгенерированного содержимого в config.xml.
 cordova крючок использует npm пакет  es6-template-strings:
npm install es6-template-strings --save-dev
Крюк это:
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var compile = require('es6-template-strings/compile');
var resolveToString = require('es6-template-strings/resolve-to-string');
var ROOT_DIR = process.argv[2];
var FILES = {
    SRC: "config.tpl.xml",
    DEST: "config.xml"
};
var env = process.env.NODE_ENV || 'dev';
var envFile = 'src/environments/environment.' + env + '.json';
var srcFileFull = path.join(ROOT_DIR, FILES.SRC);
var destFileFull = path.join(ROOT_DIR, FILES.DEST);
var configFileFull = path.join(ROOT_DIR, envFile);
var templateData = fs.readFileSync(srcFileFull, 'utf8');
var configData = fs.readFileSync(configFileFull, 'utf8');
var config = JSON.parse(configData);
var compiled = compile(templateData);
var content = resolveToString(compiled, config);
fs.writeFileSync(destFileFull, content);
 У меня есть файлы в каталоге src/environments/ для разных сред, которые выбираются на NODE_ENV значения NODE_ENV, которое определяется при сборке cordova. Например, если NODE_ENV=prod (production), он будет использовать файл environment.prod.json:
{
    ...
    "FACEBOOK_APP_ID": "11111111",
    "FACEBOOK_APP_NAME": "My Facebook App Name",
    ...
    "PUSH_SENDER_ID": "22222222",
    ...
}
 Когда ловушка выполнена, эта часть в cordova.tpl.xml:
<plugin name="cordova-plugin-facebook4" spec="~1.7.4">
    <variable name="APP_ID" value="${FACEBOOK_APP_ID}" />
    <variable name="APP_NAME" value="${FACEBOOK_APP_NAME}" />
</plugin>
<plugin name="phonegap-plugin-push" spec="~1.9.2">
    <variable name="SENDER_ID" value="${PUSH_SENDER_ID}" />
</plugin>
становится как:
<plugin name="cordova-plugin-facebook4" spec="~1.7.4">
    <variable name="APP_ID" value="11111111" />
    <variable name="APP_NAME" value="My Facebook App Name" />
</plugin>
<plugin name="phonegap-plugin-push" spec="~1.9.2">
    <variable name="SENDER_ID" value="22222222" />
</plugin>
Эта проблема:
 Все идет нормально. Проблема заключается в том, что когда некоторые автоматические изменения вносятся в config.xml (например, добавление плагинов), это не отражается в cordova.tpl.xml, поэтому я должен помнить, чтобы вносить изменения вручную.
Хотя способ сделать это сейчас намного лучше, чем добавлять каждую переменную среды, как раньше (это был кошмар обслуживания и подвержен ошибкам), мне все равно приходится каждый раз менять шаблон при добавлении/изменении/удалении плагина ( не так часто и легко обнаружить проблему, когда я ее забываю, но все же далеко от идеала).
Мой вопрос:
Я хотел бы знать, есть ли способ избежать этих ручных изменений, но продолжайте использовать переменные среды, как я делаю сейчас.
 Это может быть достигнуто --save внесения автоматических изменений в config.xml которые будут сделаны вместо этого в config.tpl.xml (например, при добавлении плагина с --save), если это возможно, но я не нашел ни cordova варианта cordova по этому поводу.
 Или используя config.xml в качестве шаблона и отправьте его в другое место с определенными переменными (например, в www/config.xml), и используйте config.xml в другом месте, которое будет использоваться для сборки приложения (не в config.xml в корне, т.е. шаблон). Я бы изменил только файлы src и dest в моем хуке (на config.xml и www/config.xml соответственно). Но я также не нашел способ достичь этого.
Есть мысли по этому поводу?
(Это не должно быть специфическим решением Ionic.)
Обновление (2017-10-13)
 Основываясь на ответе Бобби, я достиг того, чего хотел, как при установке, так и при удалении плагина. Я создал 4 хука: after_plugin_add, after_plugin_rm, before_plugin_add, before_plugin_rm.
 Перехватчики before копируют шаблон (config.tpl.xml) в файл config.xml а перехватчики after делают обратное.
 before_plugin_add и before_plugin_rm:
#!/usr/bin/env node
var fs = require('fs');
var path = require('path');
var ROOT_DIR = process.argv[2];
var FILES = {
    SRC: 'config.tpl.xml',
    DEST: 'config.xml'
};
var srcFileFull = path.join(ROOT_DIR, FILES.SRC);
var destFileFull = path.join(ROOT_DIR, FILES.DEST);
var templateData = fs.readFileSync(srcFileFull, 'utf8');
fs.writeFileSync(destFileFull, templateData);
 after_plugin_add и after_plugin_rm практически идентичны, просто FILES.SRC значения FILES.SRC и FILES.DEST.
