在config.xml PhoneGap上展开变量

时间:2016-08-08 15:16:17

标签: git cordova phonegap-build

有些插件需要在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>

1 个答案:

答案 0 :(得分:0)

如果有这么简单的功能会很棒,但是我知道此时唯一的选择就是使用钩子。

您可以在编译之前利用before_buildafter_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中导出的对象中拉出,覆盖配置,构建/编译,并从备份中替换已编辑的配置。

我实际上在自己的使用方面更进一步,并使用命令行参数为多个应用程序风格引入不同的变量:)

最后一个提示,确保你的钩子是可执行的。