after_plugin_install
Я строюIonic3
приложение, и мойconfig.xml
у меня есть некоторые данные, которые я хочу изменить в соответствии со своей средой (например, я хочу, чтобы у моего идентификатора приложения в Facebook были разные значения для разработки, подготовки и производства).
Я добился этого, создав шаблон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 + '.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);
У меня есть файлы вsrc/environments/
каталог для различных сред, которые выбираются на основеNODE_ENV
значение, которое определяется при сборкеcordova
, Например, еслиNODE_ENV=prod
(производство), то он будет использовать файл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
, поэтому я должен помнить, чтобы внести изменения вручную.
Хотя способ сделать это сейчас намного лучше, чем добавлять каждую переменную среды, как раньше (это был кошмар обслуживания и подвержен ошибкам), мне все равно приходится каждый раз менять шаблон при добавлении / изменении / удалении плагина ( не так часто и легко обнаружить проблему, когда я ее забываю, но все же далеко от идеала).
Мой вопрос:Я хотел бы знать, есть ли способ избежать этих ручных изменений, но продолжайте использовать переменные среды, как я делаю сейчас.
Это может быть достигнуто путем внесения автоматических изменений вconfig.xml
быть сделано дляconfig.tpl.xml
вместо этого (как при добавлении плагина с--save
), если возможно, но я не нашел ни одного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.DEST
ценности.