Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 展开config.xml PhoneGap上的变量_Git_Cordova_Phonegap Build - Fatal编程技术网

Git 展开config.xml PhoneGap上的变量

Git 展开config.xml PhoneGap上的变量,git,cordova,phonegap-build,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" /> <vari

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

...

如果有这么简单的功能,那就太棒了,但遗憾的是,我现在知道的唯一选择就是使用挂钩

您可以利用
生成前
生成后
事件在编译前有效地编辑配置,然后在过程完成后将其更改回

这是未经测试的代码,但看起来是这样的:

/scripts/before\u build/config\u 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');
}
#!/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);
}
module.exports = {
  FABRIC_API_KEY: 'blablabla',
  FABRIC_API_SECRET: 'blablabla_secret',
};
/scripts/after\u build/config\u 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');
}
#!/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);
}
module.exports = {
  FABRIC_API_KEY: 'blablabla',
  FABRIC_API_SECRET: 'blablabla_secret',
};
/.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');
}
#!/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);
}
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
中导出的对象中提取,覆盖配置,生成/编译,并从备份中替换已编辑的配置

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


最后一个技巧是,确保钩子是可执行的。

您知道构建后钩子是否总是被调用,即使构建因任何原因(如CTRL+C)失败,但不幸的是,它们不是,因此如果构建失败,您最终将使用更改后的config.xml。幸运的是,如果您使用VCS进行跟踪,这是一个简单的解决方案,但至少说起来还是不方便的:/