Saya menggunakan reaksi asli untuk membangun aplikasi lintas platform, tetapi saya tidak tahu cara mengatur variabel lingkungan sehingga saya dapat memiliki konstanta yang berbeda untuk lingkungan yang berbeda.
Contoh:
development:
BASE_URL: '',
API_KEY: '',
staging:
BASE_URL: '',
API_KEY: '',
production:
BASE_URL: '',
API_KEY: '',
react-native
Damon Yuan
sumber
sumber
import {Platform} from 'react-native';
console.log(Platform);
Jawaban:
Daripada mengkodekan konstanta aplikasi Anda dan melakukan pergantian pada lingkungan (saya akan menjelaskan bagaimana melakukannya sebentar lagi), saya sarankan menggunakan dua belas faktor saran agar proses pembangunan Anda menentukan Anda
BASE_URL
dan AndaAPI_KEY
.Untuk menjawab bagaimana mengekspos lingkungan Anda
react-native
, saya sarankan menggunakan variabel Babel -plugin-transform-inline-environment-variable .Agar ini berfungsi, Anda perlu mengunduh plugin dan kemudian Anda harus menyiapkan
.babelrc
dan harus terlihat seperti ini:Dan jika Anda mengubah kode asli-reaksi Anda dengan menjalankan
API_KEY=my-app-id react-native bundle
(atau memulai, menjalankan-ios, atau menjalankan-android) maka yang harus Anda lakukan adalah membuat kode Anda terlihat seperti ini:Dan kemudian Babel akan menggantinya dengan:
Semoga ini membantu!
sumber
process.env
adalahNODE_ENV
.process.env.API_KEY
... gunakanprocess.env['API_KEY']
sajareact-native start --reset-cache
setiap kali Anda mengubah variabel lingkungan.Solusi paling sederhana (bukan yang terbaik atau ideal ) yang saya temukan adalah menggunakan react-native-dotenv . Anda cukup menambahkan preset "react-native-dotenv" ke
.babelrc
file Anda di root proyek seperti:Buat
.env
file dan tambahkan properti:Kemudian di proyek Anda (JS):
sumber
base_url
untuk keduanyastaging
danproduction
?.env
file yang berbeda (per lingkungan), atau tentang menggunakan kembali beberapa nilai Anda dalam.env
file yang berbeda , sehingga Anda tidak menduplikatnya, katakanlah, Pementasan dan Produksi?.env
file yang berbeda per lingkungan katakanlahstaging
danproduction
.Menurut pendapat saya pilihan terbaik adalah menggunakan react-native-config . Ini mendukung 12 faktor .
Saya menemukan paket ini sangat berguna. Anda dapat mengatur beberapa lingkungan, misalnya pengembangan, pementasan, produksi.
Dalam hal Android, variabel tersedia juga di kelas Java, gradle, AndroidManifest.xml dll. Dalam kasus iOS, variabel tersedia juga di kelas Obj-C, Info.plist.
Anda cukup membuat file seperti
.env.development
.env.staging
.env.production
Anda mengisi file-file ini dengan kunci, nilai-nilai suka
dan kemudian gunakan saja:
Jika Anda ingin menggunakan lingkungan yang berbeda, pada dasarnya Anda menetapkan variabel ENVFILE seperti ini:
atau untuk merakit aplikasi untuk produksi (android dalam kasus saya):
sumber
Bereaksi asli tidak memiliki konsep variabel global. Ini menegakkan lingkup modular secara ketat, untuk mempromosikan modularitas komponen dan usabilitas ulang.
Namun, kadang-kadang, Anda perlu komponen untuk mengetahui lingkungannya. Dalam hal ini sangat mudah untuk mendefinisikan
Environment
modul yang komponennya dapat dipanggil untuk mendapatkan variabel lingkungan, misalnya:lingkungan.js
my-component.js
Ini menciptakan lingkungan tunggal yang dapat diakses dari mana saja di dalam lingkup aplikasi Anda. Anda harus secara eksplisit
require(...)
modul dari komponen apa pun yang menggunakan variabel Lingkungan, tetapi itu adalah hal yang baik.sumber
getPlatform()
. Saya telah membuat file seperti ini tetapi tidak dapat menyelesaikan logikanya di React Nativestaging
atauproduction
bahkan, karena itu tergantung pada lingkungan Anda. Misalnya, jika Anda ingin rasa yang berbeda untuk iOS vs Android maka Anda dapat menginisialisasi Lingkungan dengan mengimpor Andaindex.ios.js
danindex.android.js
file dan pengaturan platform sana, misalnyaEnvironment.initialize('android')
.env.js
file, pastikan untuk mengabaikannya dari check-in ke repositori dan salin kunci yang digunakan, dengan nilai string kosong, keenv.js.example
file lain yang Anda lakukan check-in sehingga orang lain dapat membangun aplikasi Anda dengan lebih mudah. Jika Anda secara tidak sengaja memeriksa rahasia proyek, pertimbangkan untuk menulis ulang riwayat untuk menghapusnya bukan hanya dari sumbernya tetapi juga sejarahnya.Saya menggunakan
__DEV__
polyfill yang dibangun ke dalam reaksi-asli untuk mengatasi masalah ini. Secara otomatis diaturtrue
selama Anda tidak membangun reaksi asli untuk produksi.Misalnya:
Maka adil
import {url} from '../vars'
dan Anda akan selalu mendapatkan yang benar. Sayangnya, ini tidak akan berfungsi jika Anda menginginkan lebih dari dua lingkungan, tetapi mudah dan tidak melibatkan penambahan lebih banyak ketergantungan pada proyek Anda.sumber
Metode spesifik yang digunakan untuk mengatur variabel lingkungan akan bervariasi berdasarkan layanan CI, pendekatan pembangunan, platform dan alat yang Anda gunakan.
Jika Anda menggunakan Buddybuild untuk CI untuk membangun aplikasi dan mengelola variabel lingkungan , dan Anda memerlukan akses ke konfigurasi dari JS, buat
env.js.example
kunci dengan (dengan nilai string kosong) untuk check-in ke kontrol sumber, dan gunakan Buddybuild untuk menghasilkanenv.js
file saat membangun dipost-clone
langkah, menyembunyikan konten file dari log bangunan, seperti:Tip: Jangan lupa untuk menambahkan
env.js
untuk.gitignore
jadi config dan rahasia tidak diperiksa ke kontrol sumber sengaja selama perkembangan.Anda kemudian dapat mengelola bagaimana file ditulis menggunakan variabel Buddybuild seperti
BUDDYBUILD_VARIANTS
, misalnya, untuk mendapatkan kontrol yang lebih besar tentang bagaimana konfigurasi Anda dihasilkan pada waktu build.sumber
env.js.example
kerjanya? katakanlah saya ingin meluncurkan aplikasi di lingkungan lokal saya. jikaenv.js
file saya ada di gitignore danenv.js.example
digunakan sebagai garis besar,env.js.example
itu bukan ekstensi JS yang sah, jadi saya hanya sedikit bingung dengan apa yang Anda maksud dengan bagian inienv.js.example
File duduk di basis kode sebagai dokumen referensi, sumber kebenaran kanonik tentang apa kunci konfigurasi yang ingin dikonsumsi aplikasi. Keduanya menjelaskan kunci yang diperlukan untuk menjalankan aplikasi, serta nama file yang diharapkan setelah disalin dan diganti namanya. Pola ini umum di aplikasi Ruby menggunakan permata dotenv , yang merupakan asal saya mengangkat pola.Saya pikir sesuatu seperti perpustakaan berikut ini dapat membantu Anda memecahkan sedikit puzzle yang hilang, fungsi getPlatform ().
https://github.com/joeferraro/react-native-env
Satu-satunya masalah yang saya lihat dengan ini, yaitu kode async. Ada permintaan tarik untuk mendukung getSync. Lihat juga.
https://github.com/joeferraro/react-native-env/pull/9
sumber
Saya telah membuat skrip pra-bangun untuk masalah yang sama karena saya memerlukan beberapa titik akhir api differents untuk lingkungan differents
Dan saya telah membuat kebiasaan
npm run scripts
untuk menjalankan menjalankan reaksi-asli ..Paket-json saya
Kemudian dalam komponen layanan saya, cukup impor file yang dibuat secara otomatis:
sumber
Langkah 1: Buat komponen terpisah seperti ini Nama komponen: pagebase.js
Langkah 2: Di dalam ini gunakan kode ini
Langkah 3: Gunakan di komponen apa pun, untuk menggunakannya, impor komponen ini terlebih dahulu, lalu gunakan. Impor dan gunakan:
sumber
Saya menggunakan
babel-plugin-transform-inline-environment-variables
.Apa yang saya lakukan adalah meletakkan file konfigurasi dalam S3 dengan lingkungan saya yang berbeda.
SETIAP file env:
Setelah itu, saya menambahkan skrip baru di saya
package.json
yang menjalankan skrip untuk bundlingDi dalam aplikasi Anda, Anda mungkin memiliki file konfigurasi yang memiliki:
yang akan diganti oleh babel ke:
INGAT Anda harus menggunakan
process.env['STRING']
TIDAKprocess.env.STRING
atau itu tidak akan mengkonversi dengan benar.sumber
REMEMBER you have to use process.env['STRING'] NOT process.env.STRING or it won't convert properly.
Terima kasih! Ini yang membuatku tersandung !!![Sumber] Dari apa yang saya temukan, sepertinya secara default, hanya dimungkinkan untuk melakukan konfigurasi produksi dan pengembangan (tidak ada tahapan atau lingkungan lain) - benarkah itu?
Saat ini, saya telah menggunakan file environment.js yang dapat digunakan untuk mendeteksi saluran rilis expo dan mengubah variabel yang dikembalikan berdasarkan itu, tetapi untuk membangun, saya perlu memperbarui variabel non- DEV yang dikembalikan menjadi pementasan atau melecut:
Alternatif
apakah ada yang punya pengalaman menggunakan react-native-dotenv untuk proyek yang dibangun dengan expo? Saya ingin mendengar pendapat Anda
https://github.com/zetachang/react-native-dotenv
sumber
Anda juga dapat memiliki skrip env yang berbeda: production.env.sh development.env.sh production.env.sh
Dan kemudian sumber mereka ketika mulai bekerja [yang hanya terikat ke alias] sehingga semua file sh telah diekspor untuk setiap variabel env:
Dan kemudian menambahkan variabel -abel-plugin-transform-in-lingkungan-variabel akan memungkinkan mengaksesnya dalam kode:
sumber
@ chapinkapa jawabannya bagus. Pendekatan yang saya ambil sejak Mobile Center tidak mendukung variabel lingkungan, adalah mengekspos konfigurasi build melalui modul asli:
Di android:
atau di ios:
Anda dapat membaca konfigurasi build secara sinkron dan memutuskan dalam Javascript bagaimana Anda akan berperilaku.
sumber
Dimungkinkan untuk mengakses variabel dengan
process.env.blabla
bukanprocess.env['blabla']
. Saya baru-baru ini membuatnya bekerja dan berkomentar tentang bagaimana saya melakukannya pada masalah di GitHub karena saya punya beberapa masalah dengan cache berdasarkan jawaban yang diterima. Inilah masalahnya.sumber
Untuk versi RN terbaru, Anda dapat menggunakan modul asli ini: https://github.com/luggit/react-native-config
sumber