Estou usando o react-native para criar um aplicativo de plataforma cruzada, mas não sei como definir a variável de ambiente para que eu possa ter constantes diferentes para ambientes diferentes.
Exemplo:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Damon Yuan
fonte
fonte
import {Platform} from 'react-native';
console.log(Platform);
Respostas:
Em vez de codificar constantemente as constantes de seu aplicativo e mudar o ambiente (explicarei como fazer isso em um momento), sugiro usar a sugestão de doze fatores para que seu processo de criação defina o seu
BASE_URL
e o seuAPI_KEY
.Para responder como expor seu ambiente
react-native
, sugiro usar as variáveis de ambiente babel-plugin-transform-inline-environment .Para que isso funcione, é necessário fazer o download do plug-in e, em seguida, você precisará configurar um
.babelrc
e deve ser algo como isto:E assim, se você transpilar seu código nativo de reação executando
API_KEY=my-app-id react-native bundle
(ou iniciar, executar ios ou executar android), tudo o que você precisa fazer é fazer com que seu código fique assim:E então Babel substituirá isso por:
Espero que isto ajude!
fonte
process.env
éNODE_ENV
.process.env.API_KEY
... usoprocess.env['API_KEY']
em vezreact-native start --reset-cache
sempre que alterar as variáveis de ambiente.A solução mais simples (não a melhor ou a ideal ) que encontrei foi usar react-native-dotenv . Você simplesmente adiciona a predefinição "react-native-dotenv" ao seu
.babelrc
arquivo na raiz do projeto, da seguinte maneira:Crie um
.env
arquivo e adicione propriedades:Então no seu projeto (JS):
fonte
base_url
para ambosstaging
eproduction
?.env
arquivos diferentes (por ambiente) ou sobre a reutilização de alguns de seus valores em.env
arquivos diferentes , para não duplicá-los entre, por exemplo, Estadiamento e produção?.env
arquivos diferentes por ambiente, digamosstaging
eproduction
.Na minha opinião, a melhor opção é usar o react-native-config . Suporta 12 fatores .
Achei este pacote extremamente útil. Você pode definir vários ambientes, por exemplo, desenvolvimento, preparação, produção.
No caso do Android, as variáveis também estão disponíveis nas classes Java, gradle, AndroidManifest.xml etc. No caso do iOS, as variáveis também estão disponíveis nas classes Obj-C, Info.plist.
Você acabou de criar arquivos como
.env.development
.env.staging
.env.production
Você preenche esses arquivos com chave, valores como
e depois use:
Se você deseja usar ambientes diferentes, basicamente define a variável ENVFILE como esta:
ou para montar o aplicativo para produção (android no meu caso):
fonte
O reagir nativo não tem o conceito de variáveis globais. Ele aplica o escopo modular estritamente, a fim de promover a modularidade e a reutilização de componentes.
Às vezes, porém, você precisa de componentes para conhecer o ambiente deles. Nesse caso, é muito simples definir um
Environment
módulo que componentes podem chamar para obter variáveis de ambiente, por exemplo:environment.js
my-component.js
Isso cria um ambiente singleton que pode ser acessado de qualquer lugar dentro do escopo do seu aplicativo. Você precisa explicitamente
require(...)
o módulo de qualquer componente que use variáveis de ambiente, mas isso é uma coisa boa.fonte
getPlatform()
. Eu tenho fazer um arquivo como este, mas não pode terminar a lógica aqui em Reagir Nativestaging
ouproduction
até mesmo quero dizer, porque depende do seu ambiente. Por exemplo, se você quiser sabores diferentes para IOS vs Android, então você pode inicializar Ambiente importando-osindex.ios.js
eindex.android.js
ficheiros e definir a plataforma lá, por exemploEnvironment.initialize('android')
.env.js
arquivo, certifique-se de ignorá-lo dos check-ins no repositório e copie as chaves usadas, com valores de sequência vazios, em outroenv.js.example
arquivo em que você faz o check-in para que outras pessoas possam criar seu aplicativo mais facilmente. Se você acidentalmente verificar os segredos do projeto, considere reescrever o histórico para removê-los não apenas da fonte, mas também do histórico.Eu usei o
__DEV__
polyfill que é incorporado ao react-native para resolver esse problema. Ele é definido automaticamentetrue
como contanto que você não construa reagir nativo para produção.Por exemplo:
Então apenas
import {url} from '../vars'
e você sempre obterá o correto. Infelizmente, isso não funcionará se você quiser mais de dois ambientes, mas é fácil e não envolve adicionar mais dependências ao seu projeto.fonte
O método específico usado para definir variáveis de ambiente varia de acordo com o serviço de IC, a abordagem de construção, a plataforma e as ferramentas que você está usando.
Se você estiver usando o Buddybuild for CI para criar um aplicativo e gerenciar variáveis de ambiente , e precisar acessar a configuração do JS, crie um
env.js.example
com chaves (com valores de cadeia vazios) para fazer check-in no controle de origem e use o Buddybuild para produzir umenv.js
no momento da construçãopost-clone
, ocultando o conteúdo do arquivo dos logs de construção, da seguinte maneira:Dica: Não se esqueça de adicionar
env.js
para.gitignore
que a configuração e os segredos não sejam verificados acidentalmente no controle de origem durante o desenvolvimento.Você pode gerenciar como o arquivo é gravado usando as variáveis Buddybuild, como
BUDDYBUILD_VARIANTS
, por exemplo, para obter maior controle sobre como sua configuração é produzida no momento da criação.fonte
env.js.example
peça funciona? Digamos que eu queira iniciar o aplicativo no meu ambiente local. se meuenv.js
arquivo está em gitignore eenv.js.example
é usado como um esboço, oenv.js.example
não é uma extensão legítima JS, então eu só estou um pouco confuso sobre o que você quis dizer com essa parteenv.js.example
arquivo fica na base de código como um documento de referência, uma fonte canônica da verdade sobre quais chaves de configuração o aplicativo deseja consumir. Ambos descrevem as chaves necessárias para executar o aplicativo, bem como o nome do arquivo esperado, uma vez copiado e renomeado. O padrão é comum em aplicativos Ruby usando a gema dotenv , que é de onde eu tirei o padrão.Penso que algo como a seguinte biblioteca poderia ajudá-lo a resolver o pedaço que faltava no quebra-cabeça, a função getPlatform ().
https://github.com/joeferraro/react-native-env
O único problema que vejo com isso, é o código assíncrono. Há uma solicitação pull para oferecer suporte ao getSync. Confira também.
https://github.com/joeferraro/react-native-env/pull/9
fonte
Eu criei um script de pré-construção para o mesmo problema, porque eu preciso de alguns pontos de extremidade da API diferentes para os diferentes ambientes
E eu criei um personalizado
npm run scripts
para executar a execução nativa de reação ..Meu pacote-json
Em meus componentes de serviços, basta importar o arquivo gerado automaticamente:
fonte
Etapa 1: Crie um componente separado como este Nome do componente: pagebase.js
Etapa 2: Dentro deste código de uso,
Etapa 3: use-o em qualquer componente; para usá-lo, importe-o primeiro e depois use-o. Importe-o e use-o:
fonte
Eu uso
babel-plugin-transform-inline-environment-variables
.O que fiz foi colocar um arquivo de configuração no S3 com meus diferentes ambientes.
CADA arquivo env:
Depois, adicionei um novo script no meu
package.json
que executa um script para agruparDentro do seu aplicativo, você provavelmente terá um arquivo de configuração que possui:
que será substituído por babel para:
Lembre-se de que você deve usar
process.env['STRING']
NOTprocess.env.STRING
ou ele não será convertido corretamente.fonte
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
Obrigado! Esse é o que mais me engana !!![Fonte] Pelo que descobri, parece que por padrão, só é possível fazer configurações de produção e desenvolvimento (sem preparação ou outros ambientes) - está certo?
No momento, estou usando um arquivo environment.js que pode ser usado para detectar canais de liberação expo e alterar as variáveis retornadas com base nisso, mas, para criar, preciso atualizar a variável não DEV retornada para preparação ou prod:
Alternativas
alguém tem experiência usando react-native-dotenv para projetos criados com expo? Eu adoraria ouvir seus pensamentos
https://github.com/zetachang/react-native-dotenv
fonte
você também pode ter scripts env diferentes: production.env.sh development.env.sh production.env.sh
E depois forneça-os quando começar a trabalhar [que está apenas vinculado a um alias], para que todo o arquivo sh tenha seja exportado para cada variável env:
E adicionar babel-plugin-transform-inline-environment-variables permitirá acessá-las no código:
fonte
A resposta de @ chapinkapa é boa. Uma abordagem adotada desde que o Mobile Center não oferece suporte a variáveis de ambiente é expor a configuração de compilação por meio de um módulo nativo:
No android:
ou no ios:
Você pode ler a configuração da compilação de forma síncrona e decidir em Javascript como vai se comportar.
fonte
É possível acessar as variáveis com em
process.env.blabla
vez deprocess.env['blabla']
. Recentemente, fiz o trabalho e comentei sobre como o fiz em um problema no GitHub porque tive alguns problemas com o cache com base na resposta aceita. Aqui está a questão.fonte
Para as versões mais recentes do RN, você pode usar este módulo nativo: https://github.com/luggit/react-native-config
fonte