Cordova config.xml variables de entorno
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.