我有3个发布渠道-开发人员,质量检查人员,产品人员。
const ENV_MODES = {
dev: {
},
prod: {
},
qa: {
}
}
ENV_MODES.default = ENV_MODES.prod
const getEnvVars = channel => {
if (process.env.NODE_ENV !== 'production') return ENV_MODES.dev
if (channel === null || channel === undefined || channel === '') return ENV_MODES.prod
if (channel.startsWith(ENV_DEV)) return ENV_MODES.dev
if (channel.startsWith(ENV_QA)) return ENV_MODES.qa
if (channel.startsWith(ENV_PROD)) return ENV_MODES.prod
return ENV_MODES.default
}
const ENV = getEnvVars(Constants.manifest.releaseChannel)
但是我不想把密钥放到仓库中。
我该如何处理?据我了解,我不能指望在质量检查频道中发布NODE_ENV === 'qa'
答案 0 :(得分:1)
您可以使用react-native-dotenv并将密钥添加到.env
文件,然后将其添加到.gitignore
。这样,您就无需将键推到您的存储库中,并且可以根据运行代码的环境来更改变量。
要使用该库,只需要将其添加到devDependencies
并将其添加到babel.config.js
文件中,就像这样:
module.exports = function (api) {
api.cache(true);
return {
presets: [
'babel-preset-expo',
'module:react-native-dotenv',
],
};
};
编辑:
NODE_ENV
与您的发布频道不同。如果要基于发布渠道加载配置,请使用Expo.Constants.manifest.releaseChannel
。
但是请记住,根据expo的文档,该变量在开发模式下不存在。
Expo.Constants.manifest.releaseChannel在开发人员模式下不存在。它确实存在,但是当您显式发布/构建它时。
编辑2:
下面是一个示例,说明如何为每个发布渠道实现两种单独的配置,以及如何使用react-native-dotenv
避免将秘密推送到您的Git存储库(因为这很重要)。
记住:将.env
文件添加到.gitignore
。
// eslint-disable-next-line import/no-extraneous-dependencies
import { AWS_KEY } from 'react-native-dotenv';
import { Constants as ExpoConstants } from 'expo';
const getChannelConfigs = (releaseChannel = '') => {
switch (releaseChannel) {
case 'qa':
return {
API_URL: 'https://qa.com/api',
...
};
case 'prod':
return {
API_URL: 'https://prod.com/api/',
...
};
default:
return {
API_URL: 'https://dev.com/api/',
...
};
}
};
const CHANNEL_CONFIGS = Object.freeze(getChannelConfigs(ExpoConstants.manifest.releaseChannel));
export default { AWS_KEY, CHANNEL_CONFIGS };
AWS_KEY='superSecretKeyDoNOTStealThx'
在此示例中,我们根据应用的发布渠道配置应用将调用的API URL。我们还避免将密钥提交给Git存储库,因为现在我们将其保存在舒适的.env
文件中。
值得一提的是,在CI中构建独立应用程序时,此设置有效,但是将密钥交给用户可能不是最好的主意。