react-native - 如何在本机反应(博览会)中保持我的钥匙安全?
问题描述
我有 3 个发布渠道 - dev、qa、prod。
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'
会在 QA 频道中发布
解决方案
您可以使用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
.
常量.js
// 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 };
.env
AWS_KEY='superSecretKeyDoNOTStealThx'
在此示例中,我们正在配置应用程序将根据其发布渠道调用的 API URL。我们还避免将密钥提交到我们的 Git 存储库,因为我们现在将它们放在一个舒适的.env
文件中。
还值得一提的是,在 CI 中构建独立应用程序时,此设置有效,但将密钥交给用户可能不是最好的主意。
推荐阅读
- docker - 通过 .env.local 覆盖环境值
- flutter - Flutter:如何在不重建的情况下接收新数据和更新 Widget
- c# - Nuget包`contentFiles`没有被复制到项目中
- node.js - Apollo-react SSR 不返回数据,但返回加载:true
- python - c++和python从前序遍历构造bst的解决方案的区别
- jmeter - 在 JMeter 中多次引用多个不同的“HTTP 请求默认值”配置元素
- c++ - 表示最短路径的内存有效方法?
- html - 需要在html中存储图片/视频
- sqlite - .net 核心身份是否与 localdb 一起使用?
- javascript - 在 Plotly javascript 中控制轴值的权重/粗体