Estoy usando react-native para construir una aplicación multiplataforma, pero no sé cómo configurar la variable de entorno para poder tener diferentes constantes para diferentes entornos.
Ejemplo:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Damon Yuan
fuente
fuente
import {Platform} from 'react-native';
console.log(Platform);
Respuestas:
En lugar de codificar constantemente las constantes de su aplicación y hacer un cambio en el entorno (explicaré cómo hacerlo en un momento), sugiero usar la sugerencia de doce factores para que su proceso de compilación defina su
BASE_URL
y suAPI_KEY
.Para responder a cómo exponer su entorno
react-native
, sugiero usar las variables babel-plugin-transform-inline-environment-variables de Babel .Para que esto funcione, debe descargar el complemento y luego deberá configurar un
.babelrc
y debería verse así:Entonces, si transpila su código nativo de reacción ejecutando
API_KEY=my-app-id react-native bundle
(o start, run-ios o run-android), todo lo que tiene que hacer es hacer que su código se vea así:Y luego Babel lo reemplazará con:
¡Espero que esto ayude!
fuente
process.env
esNODE_ENV
.process.env.API_KEY
... useprocess.env['API_KEY']
en su lugarreact-native start --reset-cache
cada vez que cambie las variables de entorno.La solución más simple (no la mejor o la ideal ) que encontré fue usar react-native-dotenv . Simplemente agregue el preset "react-native-dotenv" a su
.babelrc
archivo en la raíz del proyecto de la siguiente manera:Crea un
.env
archivo y agrega propiedades:Luego en su proyecto (JS):
fuente
base_url
para ambosstaging
yproduction
?.env
archivos (por entorno) o sobre la reutilización de algunos de sus valores en diferentes.env
archivos, para no duplicarlos, por ejemplo, por etapas y producción?.env
archivos por entorno, digamosstaging
yproduction
.En mi opinión, la mejor opción es usar react-native-config . Es compatible con 12 factores .
Encontré este paquete extremadamente útil. Puede configurar múltiples entornos, por ejemplo, desarrollo, puesta en escena, producción.
En el caso de Android, las variables están disponibles también en las clases Java, gradle, AndroidManifest.xml, etc. En el caso de iOS, las variables también están disponibles en las clases Obj-C, Info.plist.
Simplemente creas archivos como
.env.development
.env.staging
.env.production
Rellena estos archivos con clave, valores como
y luego solo utilízalo:
Si desea utilizar diferentes entornos, básicamente configura la variable ENVFILE de esta manera:
o para ensamblar aplicaciones para producción (Android en mi caso):
fuente
React native no tiene el concepto de variables globales. Hace cumplir el alcance modular estrictamente el para promover la modularidad y la reutilización de los componentes.
A veces, sin embargo, necesita componentes para conocer su entorno. En este caso, es muy simple definir un
Environment
módulo al que los componentes pueden llamar para obtener variables de entorno, por ejemplo:environment.js
my-component.js
Esto crea un entorno singleton al que se puede acceder desde cualquier lugar dentro del alcance de su aplicación. Debe explícitamente
require(...)
el módulo desde cualquier componente que use variables de entorno, pero eso es algo bueno.fuente
getPlatform()
. He creado un archivo como este, pero no puedo terminar la lógica aquí en React Nativestaging
niproduction
siquiera quiero decir, porque depende de su entorno. Por ejemplo, si quieres diferentes sabores para iOS vs Android a continuación, puede inicializar el Medio Ambiente mediante la importación de susindex.ios.js
yindex.android.js
archivos y el establecimiento de la plataforma de allí, por ejemploEnvironment.initialize('android')
.env.js
archivo, asegúrese de ignorarlo desde los registros en el repositorio y copie las claves utilizadas, con valores de cadena vacíos, en otroenv.js.example
archivo que registre para que otros puedan construir su aplicación más fácilmente. Si accidentalmente registra los secretos del proyecto, considere volver a escribir el historial para eliminarlos no solo de la fuente sino también del historial de los mismos.Utilicé el
__DEV__
polyfill que está integrado en react-native para resolver este problema. Se configura automáticamente entrue
tanto que no esté creando reacción nativa para la producción.P.ej:
Entonces solo
import {url} from '../vars'
y siempre obtendrás el correcto. Desafortunadamente, esto no funcionará si desea más de dos entornos, pero es fácil y no implica agregar más dependencias a su proyecto.fuente
El método específico utilizado para establecer variables de entorno variará según el servicio de CI, el enfoque de compilación, la plataforma y las herramientas que esté utilizando.
Si está utilizando Buddybuild para CI para construir una aplicación y administrar variables de entorno , y necesita acceso a la configuración desde JS, cree una
env.js.example
con claves (con valores de cadena vacíos) para registrarse en el control de origen y use Buddybuild para producir unenv.js
archivo en tiempo de compilación en elpost-clone
paso, ocultando el contenido del archivo de los registros de compilación, así:Consejo: No olvide agregar
env.js
para.gitignore
que la configuración y los secretos no se verifiquen accidentalmente en el control de origen durante el desarrollo.A continuación, puede administrar la forma en que el archivo se escribe utilizando las variables de Buddybuild como
BUDDYBUILD_VARIANTS
, por ejemplo, para obtener un mayor control sobre la forma en que su configuración se produce en tiempo de compilación.fuente
env.js.example
pieza? Digamos que quiero iniciar la aplicación en mi entorno local. si mienv.js
archivo está en gitignore yenv.js.example
se usa como un esquema,env.js.example
no es una extensión JS legítima, así que estoy un poco confundido sobre lo que quisiste decir con esta parteenv.js.example
archivo se encuentra en la base de código como documento de referencia, una fuente canónica de verdad sobre qué claves de configuración quiere consumir la aplicación. Ambos describen las claves necesarias para ejecutar la aplicación, así como el nombre de archivo esperado una vez copiado y renombrado. El patrón es común en las aplicaciones de Ruby que usan la gema dotenv , que es de donde saqué el patrón.Creo que algo como la siguiente biblioteca podría ayudarlo a resolver la parte faltante del rompecabezas, la función getPlatform ().
https://github.com/joeferraro/react-native-env
El único problema que veo con esto es que es un código asíncrono. Hay una solicitud de extracción para admitir getSync. Compruébalo también.
https://github.com/joeferraro/react-native-env/pull/9
fuente
He creado un script de precompilación para el mismo problema porque necesito algunos puntos finales de API diferentes para los diferentes entornos.
Y he creado una costumbre
npm run scripts
para ejecutar react-native.Mi paquete-json
Luego, en mis componentes de servicios, simplemente importe el archivo generado automáticamente:
fuente
Paso 1: Cree un componente separado como este Nombre del componente: pagebase.js
Paso 2: Dentro de este código de uso, esto
Paso 3: Úselo en cualquier componente, para usarlo primero importe este componente y luego úselo. Importarlo y usarlo:
fuente
Yo uso
babel-plugin-transform-inline-environment-variables
.Lo que hice fue poner un archivo de configuración dentro de S3 con mis diferentes entornos.
CADA archivo env:
Luego, agregué un nuevo script en mi
package.json
que ejecuta un script para agruparDentro de su aplicación, probablemente tendrá un archivo de configuración que tiene:
que será reemplazado por babel para:
RECUERDA que debes usar
process.env['STRING']
NOTprocess.env.STRING
o no se convertirá correctamente.fuente
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
¡Gracias! ¡Este es el que me hace tropezar![Fuente] Por lo que he encontrado, parece que por defecto, solo es posible hacer configuraciones de producción y desarrollo (sin escenarios u otros entornos), ¿es eso correcto?
En este momento, he estado usando un archivo environment.js que se puede usar para detectar canales de publicación de expo y cambiar las variables devueltas en función de eso, pero para compilar, necesito actualizar la variable que no es DEV devuelta para ser puesta en escena o pinchar:
Alternativas
¿Alguien tiene experiencia con react-native-dotenv para proyectos creados con expo? Me encantaría escuchar tus pensamientos
https://github.com/zetachang/react-native-dotenv
fuente
también puede tener diferentes scripts env: production.env.sh development.env.sh production.env.sh
Y luego instálelos cuando comience a funcionar [que está vinculado a un alias] para que todo el archivo sh se exporte para cada variable env:
Y luego agregar babel-plugin-transform-inline-environment-variables permitirá acceder a ellas en el código:
fuente
La respuesta de @ chapinkapa es buena. Un enfoque que he tomado desde que Mobile Center no admite variables de entorno es exponer la configuración de compilación a través de un módulo nativo:
En Android:
o en ios:
Puede leer la configuración de compilación sincrónicamente y decidir en Javascript cómo se va a comportar.
fuente
Es posible acceder a las variables con en
process.env.blabla
lugar deprocess.env['blabla']
. Recientemente lo hice funcionar y comenté cómo lo hice en un problema en GitHub porque tuve algunos problemas con el caché en función de la respuesta aceptada. Aquí está el problema.fuente
Para las últimas versiones de RN, puede usar este módulo nativo: https://github.com/luggit/react-native-config
fuente