有些插件需要在config.xml文件中使用api secret等值,但我不希望在我的repo上提交类似的提交,而是我想将它们放在不同的文件上并展开配置示例
<widget ...>
...
<plugin name="cordova-fabric-plugin" spec="~1.0.8">
<variable name="FABRIC_API_KEY" value="blablabla" />
<variable name="FABRIC_API_SECRET" value="blablabla_secret" />
</plugin>
</widget>
我怎么能做像
这样的事情<widget ...>
...
<plugin name="cordova-fabric-plugin" spec="~1.0.8">
<variable name="FABRIC_API_KEY" value="${FABRIC_API_KEY}" />
<variable name="FABRIC_API_SECRET" value="${FABRIC_API_SECRET}" />
</plugin>
</widget>
答案 0 :(得分:0)
如果有这么简单的功能会很棒,但是我知道此时唯一的选择就是使用钩子。
您可以在编译之前利用before_build
和after_build
事件有效地编辑您的配置,然后在流程完成后将其更改回来。
这是未经测试的代码,但它看起来像这样:
<强> /scripts/before_build/config_variables.js 强>
#!/usr/bin/env node
var fs = require('fs');
var variables = require('./../../.variables');
module.exports = function(context) {
var configPath = 'config.xml';
var configBackupPath = 'config.xml.backup';
var config = fs.readFileSync(configPath, 'ascii');
fs.writeFileSync(configBackupPath, config, 'ascii');
var tempConfig = config.replace(/\${(.*?)}/g, function (match, variableName) {
if (variables.hasOwnProperty(variableName)) {
return variables[variableName];
} else {
return match;
}
});
fs.writeFileSync(configPath, tempConfig, 'ascii');
}
<强> /scripts/after_build/config_variables.js 强>
#!/usr/bin/env node
var fs = require('fs');
module.exports = function(context) {
var configPath = 'config.xml';
var configBackupPath = 'config.xml.backup';
var realConfig = fs.readFileSync(configBackupPath, 'ascii');
fs.writeFileSync(configPath, realConfig, 'ascii');
fs.unlink(configBackupPath);
}
<强> /。variables.js 强>
module.exports = {
FABRIC_API_KEY: 'blablabla',
FABRIC_API_SECRET: 'blablabla_secret',
};
最后,您可以将这些挂钩添加到config.xml
文件本身:
<hook type="before_build" src="scripts/before_build/config_variables.js" />
<hook type="after_build" src="scripts/after_build/config_variables.js" />
现在,当您运行$ phonegap build {platform}
时,它将从.variables.js
中导出的对象中拉出,覆盖配置,构建/编译,并从备份中替换已编辑的配置。
我实际上在自己的使用方面更进一步,并使用命令行参数为多个应用程序风格引入不同的变量:)
最后一个提示,确保你的钩子是可执行的。