Cordova config.xml variables de entorno

El escenario:

Estoy construyendo unIonic3 aplicación y miconfig.xml tengo algunos datos que quiero poder cambiar de acuerdo con mi entorno (por ejemplo, quiero que la identificación de mi aplicación de Facebook tenga valores diferentes para el desarrollo, la puesta en escena y la producción).

Logré esto creando una plantillaconfig.xml (el archivo esconfig.tpl.xml) y abefore_prepare cordova enganchar para reemplazar las variables en la plantilla con los valores correctos y guardar el contenido generado enconfig.xml.

loscordova gancho utiliza elnpm paquetees6-template-strings:

npm install es6-template-strings --save-dev

El gancho es:

#!/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 + '.js,on';

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);

Tengo archivos en elsrc/environments/ directorio para diferentes entornos, que se eligen en función delNODE_ENV valor que se define cuando construyocordova. Por ejemplo, siNODE_ENV=prod (producción), entonces usaría el archivoenvironment.prod.json:

{
    ...
    "FACEBOOK_APP_ID": "11111111",
    "FACEBOOK_APP_NAME": "My Facebook App Name",
    ...
    "PUSH_SENDER_ID": "22222222",
    ...
}

Cuando se ejecuta el gancho, esta parte en elcordova.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>

se vuelve como:

<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>
El problema:

Hasta aquí todo bien. El problema es que cuando se realizan algunos cambios automáticos paraconfig.xml (como agregar complementos), no se refleja encordova.tpl.xml, así que tengo que recordar hacer los cambios manualmente.

Aunque la forma en que se hace ahora es mucho mejor que tener que agregar cada variable de entorno como antes (era una pesadilla de mantenimiento y propensa a errores), todavía tengo que cambiar la plantilla cada vez que agregue / cambie / elimine un complemento ( no tan frecuente y fácil de descubrir cuando lo olvido, pero aún lejos del ideal).

Mi pregunta:

Me gustaría saber si hay una manera de evitar estos cambios manuales, pero sigo usando las variables de entorno como lo estoy haciendo ahora.

Se podría lograr haciendo los cambios automáticos aconfig.xml para hacerse aconfig.tpl.xml en su lugar (como al agregar un complemento con--save), si es posible, pero no he encontrado ningunocordova opción sobre esto.

O usando elconfig.xml como plantilla y enviarla a otro lugar con las variables definidas (por ejemplo, awww/config.xml), y use elconfig.xml en la otra ubicación que se utilizará para crear la aplicación (no elconfig.xml en la raíz, es decir, la plantilla). Solo cambiaría elsrc ydest archivos en mi gancho (aconfig.xml ywww/config.xml, respectivamente). Pero tampoco he encontrado una manera de lograr esto.

¿Alguna idea sobre esto?

(No necesita ser una solución específica de Ionic).

Actualización (2017-10-13)

Residencia enPoliComo respuesta, logré lo que quería al instalar y desinstalar un complemento. He creado 4 ganchos:after_plugin_add, after_plugin_rm, before_plugin_add, before_plugin_rm.

losbefore los ganchos copian la plantilla (config.tpl.xml) en elconfig.xml archivo y elafter ganchos hacen lo contrario.

losbefore_plugin_add ybefore_plugin_rm Los ganchos son los siguientes:

#!/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);

losafter_plugin_add yafter_plugin_rm los ganchos son casi idénticos, solo se intercambianFILES.SRC yFILES.DEST valores.

Respuestas a la pregunta(1)

Su respuesta a la pregunta