Do tworzenia aplikacji wieloplatformowych używam native speakera, ale nie wiem, jak ustawić zmienną środowiskową, aby mieć różne stałe dla różnych środowisk.
Przykład:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Damon Yuan
źródło
źródło
import {Platform} from 'react-native';
console.log(Platform);
Odpowiedzi:
Zamiast na stałe kodować stałe aplikacji i przełączać środowisko (za chwilę wyjaśnię, jak to zrobić), sugeruję skorzystanie z dwunastoczynnikowej sugestii, aby proces tworzenia definiował Twoje
BASE_URL
i TwojeAPI_KEY
.Aby odpowiedzieć na pytanie, jak udostępnić swoje środowisko
react-native
, sugeruję użycie zmiennych babel-plugin-transform-inline-environment-zmiennych firmy Babel .Aby to działało, musisz pobrać wtyczkę, a następnie musisz skonfigurować plik
.babelrc
i powinien wyglądać mniej więcej tak:Jeśli przetransponujesz swój natywny kod, uruchamiając
API_KEY=my-app-id react-native bundle
(lub uruchamiając, run-ios lub run-android), wszystko, co musisz zrobić, to sprawić, by kod wyglądał następująco:A potem Babel zastąpi to:
Mam nadzieję że to pomoże!
źródło
process.env
toNODE_ENV
.process.env.API_KEY
... użyjprocess.env['API_KEY']
zamiast tegoreact-native start --reset-cache
każdym razem, gdy zmieniasz zmienne środowiskowe.Najprostszym (nie najlepszym ani idealnym ) rozwiązaniem, jakie znalazłem, było użycie reakcji-native-dotenv . Po prostu dodajesz ustawienie „react-native-dotenv” do swojego
.babelrc
pliku w katalogu głównym projektu w następujący sposób:Utwórz
.env
plik i dodaj właściwości:Następnie w Twoim projekcie (JS):
źródło
base_url
dla obustaging
iproduction
?.env
plików (na środowisko) lub o ponowne wykorzystanie niektórych wartości w różnych.env
plikach, aby nie powielać ich między, powiedzmy, etapami i produkcją?.env
pliki w zależności od środowiska, powiedzmystaging
iproduction
.Moim zdaniem najlepszą opcją jest użycie react-native-config . Obsługuje 12 czynników .
Uważam, że ten pakiet jest niezwykle przydatny. Możesz ustawić wiele środowisk, np. Programowanie, staging, produkcja.
W przypadku Androida zmienne dostępne są również w klasach Java, gradle, AndroidManifest.xml itp. W przypadku iOS zmienne dostępne są także w klasach Obj-C Info.plist.
Po prostu tworzysz pliki takie jak
.env.development
.env.staging
.env.production
Wypełniasz te pliki kluczami, wartościami takimi jak
a potem po prostu go użyj:
Jeśli chcesz używać różnych środowisk, po prostu ustawiasz zmienną ENVFILE w następujący sposób:
lub do składania aplikacji na produkcję (w moim przypadku Android):
źródło
React native nie ma pojęcia zmiennych globalnych. Egzekwuje ściśle zakres modułowy , aby promować modułowość komponentów i możliwość ich ponownego wykorzystania.
Czasami jednak potrzebujesz komponentów, aby mieć świadomość swojego otoczenia. W tym przypadku bardzo łatwo jest zdefiniować
Environment
moduł, którego komponenty mogą następnie wywoływać w celu pobrania zmiennych środowiskowych, na przykład:environment.js
my-component.js
Tworzy to pojedyncze środowisko, do którego można uzyskać dostęp z dowolnego miejsca w zakresie aplikacji. Musisz jawnie
require(...)
określić moduł z dowolnych komponentów, które używają zmiennych środowiskowych, ale to dobrze.źródło
getPlatform()
. Zrobiłem taki plik, ale nie mogę dokończyć logiki tutaj w React Nativestaging
lubproduction
nawet średnią, bo to zależy od środowiska. Na przykład, jeśli chcesz mieć różne smaki dla IOS vs Android, możesz zainicjować Środowisko, importując jeindex.ios.js
iindex.android.js
pliki i ustawiając tam platformę, npEnvironment.initialize('android')
.env.js
plik, pamiętaj, aby zignorować go od wyewidencjonowania do repozytorium i skopiować używane klucze, z pustymi wartościami ciągów, do innegoenv.js.example
pliku, który rejestrujesz, aby inni mogli łatwiej zbudować Twoją aplikację. Jeśli przypadkowo sprawdzisz sekrety projektu, rozważ przepisanie historii, aby usunąć je nie tylko ze źródła, ale także z historii.__DEV__
Aby rozwiązać ten problem, użyłem wypełniacza wbudowanego w React-Native. Jest automatycznie ustawianatrue
tak długo, jak długo nie tworzysz natywnego reagowania na produkcję.Na przykład:
Wtedy po prostu,
import {url} from '../vars'
a zawsze otrzymasz właściwy. Niestety, to nie zadziała, jeśli chcesz mieć więcej niż dwa środowiska, ale jest łatwe i nie wymaga dodawania większej liczby zależności do projektu.źródło
Konkretna metoda używana do ustawiania zmiennych środowiskowych będzie się różnić w zależności od usługi CI, podejścia do kompilacji, platformy i używanych narzędzi.
Jeśli używasz Buddybuild for CI do tworzenia aplikacji i zarządzania zmiennymi środowiskowymi i potrzebujesz dostępu do konfiguracji z JS, utwórz
env.js.example
klucz z kluczami (z pustymi wartościami ciągu) do wpisywania do kontroli źródła i użyj Buddybuild, aby utworzyćenv.js
plik w czasie kompilacji wpost-clone
kroku, ukrywając zawartość pliku w dziennikach kompilacji, na przykład:Wskazówka: nie zapomnij dodać
env.js
do,.gitignore
więc config i wpisy tajne nie są przypadkowo sprawdzane w kontroli źródła podczas programowania.Następnie można zarządzać jak plik zostanie napisane przy użyciu zmiennych Buddybuild jak
BUDDYBUILD_VARIANTS
, na przykład, aby uzyskać większą kontrolę nad tym, jak twój config jest produkowany w czasie kompilacji.źródło
env.js.example
część? powiedzmy, że chcę uruchomić aplikację w moim środowisku lokalnym. jeśli mójenv.js
plik jest w gitignore ienv.js.example
jest używany jako konspekt,env.js.example
nie jest to poprawne rozszerzenie JS, więc jestem trochę zdezorientowany, co masz na myśli przez tę częśćenv.js.example
Plik znajduje się w bazie kodu jako dokument referencyjny, kanoniczne źródło informacji o tym, jakie klucze konfiguracyjne aplikacja chce wykorzystać. Oba opisują klucze wymagane do uruchomienia aplikacji, a także nazwę pliku oczekiwaną po skopiowaniu i zmianie nazwy. Wzorzec jest powszechny w aplikacjach Ruby używających klejnotu dotenv , z którego wziąłem wzór.Myślę, że coś takiego jak poniższa biblioteka może pomóc w rozwiązaniu brakującego fragmentu układanki, funkcji getPlatform ().
https://github.com/joeferraro/react-native-env
Jedyny problem, jaki widzę z tym, to kod asynchroniczny. Istnieje żądanie ściągnięcia do obsługi getSync. Sprawdź też.
https://github.com/joeferraro/react-native-env/pull/9
źródło
Stworzyłem skrypt przed kompilacją dla tego samego problemu, ponieważ potrzebuję kilku różnych punktów końcowych API dla różnych środowisk
I stworzyłem niestandardowy,
npm run scripts
aby wykonać reakcję natywną.Mój pakiet-json
Następnie w moich komponentach usług po prostu zaimportuj automatycznie wygenerowany plik:
źródło
Krok 1: Utwórz oddzielny komponent, taki jak ten Nazwa komponentu: pagebase.js
Krok 2: Wewnątrz tego użyj kodu this
Krok 3: Użyj go w dowolnym komponencie, aby go użyć, najpierw zaimportuj ten komponent, a następnie użyj go. Zaimportuj i używaj:
źródło
Używam
babel-plugin-transform-inline-environment-variables
.To, co zrobiłem, to umieszczenie plików konfiguracyjnych w S3 z różnymi środowiskami.
KAŻDY plik env:
Następnie dodałem nowy skrypt do mojego,
package.json
który uruchamia skrypt do sprzedaży wiązanejW swojej aplikacji prawdopodobnie będziesz mieć plik konfiguracyjny, który zawiera:
który zostanie zastąpiony przez babel do:
PAMIĘTAJ, że musisz użyć
process.env['STRING']
NOTprocess.env.STRING
lub nie skonwertuje się poprawnie.źródło
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
Dzięki! To jest ten, który mnie podrywa !!![Źródło] Z tego, co znalazłem, wygląda na to, że domyślnie jest możliwe tylko konfigurowanie produkcyjne i programistyczne (bez etapów lub innych środowisk) - czy to prawda?
W tej chwili korzystałem z pliku environment.js, który może być użyty do wykrywania kanałów wydań expo i zmiany zwracanych na ich podstawie zmiennych, ale do budowania muszę zaktualizować zmienną inną niż DEV, aby była albo tymczasowa, albo szturchać:
Alternatywy
Czy ktoś ma doświadczenie w korzystaniu z React-native-dotenv w projektach budowanych za pomocą expo? Bardzo chciałbym usłyszeć Twoje myśli
https://github.com/zetachang/react-native-dotenv
źródło
możesz także mieć różne skrypty env: production.env.sh development.env.sh production.env.sh
A następnie zbierz je, gdy zaczniesz pracę [co jest po prostu powiązane z aliasem], więc wszystko, co ma plik sh, jest eksportowane dla każdej zmiennej env:
A następnie dodanie babel-plugin-transform-inline-environment-variable umożliwi dostęp do nich w kodzie:
źródło
Odpowiedź @ chapinkapa jest dobra. Podejście, które zastosowałem od czasu Mobile Center nie obsługuje zmiennych środowiskowych, polega na ujawnieniu konfiguracji kompilacji za pomocą modułu natywnego:
Na Androidzie:
lub na iOS:
Możesz odczytać konfigurację kompilacji synchronicznie i zdecydować w Javascript, jak będziesz się zachowywać.
źródło
Dostęp do zmiennych można uzyskać za pomocą
process.env.blabla
zamiastprocess.env['blabla']
. Niedawno sprawiłem, że to zadziałało i skomentowałem, jak to zrobiłem w problemie na GitHub, ponieważ miałem problemy z pamięcią podręczną na podstawie zaakceptowanej odpowiedzi. Oto problem.źródło
W przypadku najnowszych wersji RN możesz użyć tego natywnego modułu: https://github.com/luggit/react-native-config
źródło