Variáveis de ambiente config.xml do Cordova
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.