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 ценности.

Ответы на вопрос(1)

Решение Вопроса

Одним из решений может быть создание хуков дляbefore_plugin_install а такжеafter_plugin_install.

On before_plugin_install copy the cordova.tpl.xml to cordova.xml.
... Plugin is installed ...
On after_plugin_install copy cordova.xml to cordova.tpl.xml

Ваш ответ на вопрос