我正在开发 React Native 应用程序,该应用程序在一个文件中包含针对不同可能客户端的不同配置,例如src/config/config.js
. 这些配置相当复杂。该文件的结构基于客户端名称作为键,值作为对象条目,例如:
export default {
fooClient: {
apiUrl: "https://foo.example.com/",
barClient: {
apiUrl: "https://bar.example.com/"
}
}
当然,还有很多其他的选项键。
在构建应用程序时,我知道我要为哪个客户端执行此操作,方法是指定一个 Android 构建变体,例如:
ENVFILE=.env npx react-native run-android --variant fooDebug --appIdSuffix foo
出于安全原因,我不希望其他客户端的密钥包含在配置文件中。在构建应用程序并将其发送给客户端之前,我有哪些选项可以从此文件中删除所有其他客户端配置?
我想到了以下几点:我修改了打包程序,以便它去掉与当前构建变体不对应的键。
我现在有一个用于 Metro 的转换器插件,它执行以下操作:
const upstreamTransformer = require('metro-react-native-babel-transformer');
module.exports.transform = function(src, filename, options) {
if (typeof src === 'object') {
// handle RN >= 0.46
({ src, filename, options } = src);
}
if (filename.endsWith('config.js')) {
console.log('Transforming ' + filename);
let srcStripped = src.replace(';', '').replace('export default ', '');
let configObj = JSON.parse(srcStripped);
// TODO: get the build variant and strip all keys that we do not need from configObj
return upstreamTransformer.transform({
src: 'export default ' + JSON.stringify(configObj) + ';',
filename: filename,
options
});
} else {
return upstreamTransformer.transform({ src, filename, options });
}
};
但是我怎么知道正在使用哪个构建变体?
如果这看起来像是一个 XY 问题,我很乐意探索动态构建配置的替代方案。但是,我不能使用环境变量,因为配置太复杂而不能仅是.env
键列表。