复制代码
git://www.github.com/luggit/react-native-config.git
Git Clone代码到本地: 复制代码
git clone http://www.github.com/luggit/react-native-config
Subversion代码到本地: 复制代码
$ svn co --depth empty http://www.github.com/luggit/react-native-config
Checked out revision 1.
$ cd repo
$ svn up trunk
用于响应本机应用程序的配置变量 模块将配置变量公开到你的javascript代码中,同时支持iOS和 Android。
带来一些 12因子,喜欢你的移动应用 !
创建一个新的文件 .env
在你的React本机应用程序的root 中:
复制代码
API_URL=https://myapi.com
GOOGLE_MAPS_API_KEY=abcdefgh
然后从你的应用程序中访问定义的变量:
复制代码
importConfigfrom'react-native-config'Config.API_URL// 'https://myapi.com'Config.GOOGLE_MAPS_API_KEY// 'abcdefgh'
记住这个 MODULE 不会混淆或者加密打包密钥,因此不会在 .env
中存储敏感密钥。 基本上,阻止用户从移动应用软件中逆向工程是不可能的,所以设计你的应用程序( 和 api ) 是。
.env
中设置的配置变量通过 BuildConfig
可以用于你的Java类:
复制代码
publicHttpURLConnection getApiClient() { URL url =newURL(BuildConfig.API_URL); //.. .}
你还可以从Gradle配置中读取它们:
复制代码
defaultConfig { applicationId project.env.get("APP_ID") }
使用它们来配置 AndroidManifest.xml
中的库和其他库:
复制代码
<meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="@string/GOOGLE_MAPS_API_KEY"/>
所有变量都是字符串,因此你可能需要将它们转换为。 例如在Gradle中:
复制代码
versionCode project.env.get("VERSION_CODE").toInteger()
同样,记住存储在 .env
中的变量与代码一起发布,所以不会像你的应用程序那样放置任何敏感的东西。
从 Obj-C 类中读取在 .env
中声明的变量,例如:
复制代码
// import header#import"ReactNativeConfig.h"// then read individual keys like:NSString *apiUrl = [ReactNativeConfig envFor:@"API_URL"];// or just fetch the whole configNSDictionary *config = [ReactNativeConfig env];
它们还可以在 Info.plist
中配置,通过将 __RN_CONFIG_
设置为它的名称:
复制代码
__RN_CONFIG_API_URL
注意:需要特定设置( 请参见下面),并且在更改值以查看更新后的值之后需要一个 Product> Clean
。
保存不同文件中不同环境的配置: .env.staging
,.env.production
等。
默认react-native-config将从 .env
读取,但你可以在构建或者发布应用程序时更改它。
最简单的方法是告诉它要使用环境变量读取什么文件,例如:
复制代码
$ ENVFILE=.env.staging react-native run-ios # bash
$ SET ENVFILE='.env.staging' && react-native run-ios # windows
$ env:ENVFILE=".env.staging"; react-native run-ios # powershell
这也适用于 run-android
。 或者,下面有一些特定于平台的选项。
可以使用相同的环境变量来组合具有不同配置的发行版:
复制代码
$ cd android && ENVFILE=.env.staging./gradlew assembleRelease
或者,可以在 build.gradle
中定义与env文件关联的映射。 在 apply from
调用之前执行,并在 lowercase 中使用生成案例,例如:
复制代码
project.ext.envConfigFiles = [
debug:".env.development",
release:".env.production",
anothercustombuild:".env",
]
apply from: project(':react-native-config').projectDir.getPath() +"/dotenv.gradle"
iOS iOS的基本思想是每个环境文件都有一个方案,所以你可以轻松地在它们之间进行替换。
首先创建一个新方案:
然后编辑新创建的方案,使它的使用不同的env文件。 从同一个"管理方案"窗口中:
复制代码
echo".env.staging">/tmp/envfile # replace. env.staging for your file
这仍然有点实验和脏- 让我们知道如何使iOS使用不同的配置打开请求或者问题。
安装软件包:
复制代码
$ yarn add react-native-config
链接库:
复制代码
$ react-native link react-native-config
你还需要手动将一个插件应用到你的应用程序,从 android/app/build.gradle
:
复制代码
//2nd line, add a new apply:
apply from: project(':react-native-config').projectDir.getPath() +"/dotenv.gradle"
Preprocess Info.plist File
设置为 Yes
Info.plist Preprocessor Prefix File
到 ${BUILD_DIR}/GeneratedInfoPlistDotEnv.h
Info.plist Other Preprocessor Flags
到 -traditional
如果使用 android/app/build.gradle
,则使用不同于标记中指定的包 NAME的applicationIdSuffix
或者 applicationId
,例如支持不同的生成变量: 在 android/app/build.gradle
中添加
复制代码
defaultConfig {
. . .
resValue"string","build_config_package","YOUR_PACKAGE_NAME_IN_ANDROIDMANIFEST.XML"
}
当启用( 在默认情况下,Android发布版本) 时,它可以在缩小过程中重命名 BuildConfig
类,并防止对本地配置进行React。 若要避免这里问题,请向 android/app/proguard-rules.pro
添加异常:
复制代码
-keep class com.mypackage.BuildConfig { *; }
mypackage
应该在你的app/src/main/AndroidManifest.xml
文件中 MATCH的package
值。
为了模拟 Config.FOO_BAR
用法,在 __mocks__/react-native-config.js
上创建 mock:
复制代码
//__mocks__/react-native-config.js
export default {
FOO_BAR: 'baz',
};