我已经实现了创建一个模板config.xml(文件是config.tpl.xml)和一个before_preparecordova 挂钩来用正确的值替换模板中的变量并将生成的内容保存在config.xml 中。
cordova hook 使用 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 + '.json';
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/ 目录中有不同环境的文件,这些文件是根据我构建cordova 时定义的NODE_ENV 值选择的。例如,如果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 更改(例如添加插件),但这比必须更改每次构建之前的变量都使用不同的环境,而且更不容易出错,尽管这并不理想。
更新 (2017-10-13)
现在,当我添加/删除插件时,xml 模板文件也会更新。我刚刚添加了here 描述的钩子。