Variáveis de ambiente config.xml do Cordova

O cenário:

Estou construindo umIonic3 aplicativo e meuconfig.xml tenho alguns dados que desejo alterar de acordo com meu ambiente (por exemplo, desejo que meu ID de aplicativo do Facebook tenha valores diferentes para desenvolvimento, preparo e produção).

Eu consegui isso criando um modeloconfig.xml (o arquivo éconfig.tpl.xml) e umbefore_prepare cordova para substituir as variáveis no modelo pelos valores corretos e salvar o conteúdo gerado emconfig.xml.

ocordova gancho usa onpm pacotees6-template-strings:

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

O gancho é:

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

Eu tenho arquivos nosrc/environments/ diretório para diferentes ambientes, escolhidos com base noNODE_ENV valor que é definido quando eu construocordova. Por exemplo, seNODE_ENV=prod (produção), ele usaria o arquivoenvironment.prod.json:

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

Quando o gancho é executado, esta parte nocordova.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>

fica assim:

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

Por enquanto, tudo bem. O problema é que, quando algumas alterações automáticas são feitas paraconfig.xml (como adicionar plug-ins), não se reflete emcordova.tpl.xml, então eu tenho que lembrar de fazer as alterações manualmente.

Embora a maneira como isso seja feito agora seja muito melhor do que adicionar cada variável de ambiente como antes (era um pesadelo de manutenção e propenso a erros), ainda preciso alterar o modelo sempre que adicionar / alterar / remover um plug-in ( não tão freqüente e fácil de descobrir o problema quando o esqueço, mas ainda longe do ideal).

Minha pergunta:

Gostaria de saber se existe uma maneira de evitar essas alterações manuais, mas continue usando as variáveis de ambiente como estou fazendo agora.

Isso poderia ser alcançado fazendo as alterações automáticas noconfig.xml a ser feito paraconfig.tpl.xml em vez disso (como ao adicionar um plugin com--save), se possível, mas não encontrei nenhumcordova opção sobre isso.

Ou usando oconfig.xml como modelo e envie-o para outro local com as variáveis definidas (por exemplo, parawww/config.xml) e use oconfig.xml no outro local a ser usado para criar o aplicativo (não oconfig.xml na raiz, ou seja, o modelo). Eu mudaria apenas osrc edest arquivos no meu gancho (paraconfig.xml ewww/config.xml, respectivamente). Mas também não encontrei uma maneira de conseguir isso.

Alguma idéia sobre isso?

(Não precisa ser uma solução específica Ionic.)

Atualização (13/10/2017)

Baseado emBobbyComo resposta, consegui o que queria ao instalar e desinstalar um plug-in. Eu criei 4 ganchos:after_plugin_add, after_plugin_rm, before_plugin_add, before_plugin_rm.

obefore ganchos copiam o modelo (config.tpl.xml) noconfig.xml arquivo e oafter ganchos fazem o inverso.

obefore_plugin_add ebefore_plugin_rm ganchos são os seguintes:

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

oafter_plugin_add eafter_plugin_rm ganchos são quase idênticos, apenas trocandoFILES.SRC eFILES.DEST valores.

questionAnswers(1)

yourAnswerToTheQuestion